Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: Loop-within-loop error while looping over observations for a microsimulation
From
Nick Cox <[email protected]>
To
[email protected]
Subject
Re: st: Loop-within-loop error while looping over observations for a microsimulation
Date
Tue, 7 Aug 2012 19:09:31 +0100
Sorry, but I have only incomplete understanding of what you are trying
to do and can only comment in limited ways.
1. I don't see how your code leads to "XY" being printed.
2. The extra -capture-s here do no harm, but why do you think they are
necessary? -capture- has as its main role catching things that can go
wrong with the data; it does not serve well if used to try to save
programmers from their own bugs.
3. I have hinted before and second time round I will be blunter: The
use of .f and .i here looks as if you are trying to pack information
better stored as two variables in one variable. At a wild guess this
may be behind your difficulties, but I can't make that concrete.
Nick
On Tue, Aug 7, 2012 at 4:10 PM, Stephen Cranney
<[email protected]> wrote:
> Okay, I so I fixed the problems mentioned. I get an "invalid inXY"
> reading the first observation after the first birth and the rest stay
> as .f When I run the command with capture I get a series of 1s and 0s
> but without any of the postpartum replacements with .i.
>
> local N = _N
> local monthsofpostpartum = 12
> forvalues i = 1/`N' {
> forvalues j= 1/`monthsofpostpartum' {
> capture if childbirth[`i']== .f replace childbirth =
> rbinomial(1, probabilityconceive) in `i'
> local k = `i' + `j'
> capture if childbirth[`i']==1 replace childbirth= .i in`k'
> }
> }
>
> On Tue, Aug 7, 2012 at 4:09 AM, Nick Cox <[email protected]> wrote:
>> I am surprised at your syntax
>>
>> ... in `N'+`j'
>>
>> as I didn't know that Stata would do the mathematics there. But
>> regardless of that, observation `N' + `j' is at position _N + 1 ... _N
>> + 12 and so always outside your dataset, so nothing would be done Your
>> logic appears to call for
>>
>> local k = `i' + `j'
>> if childbirth[`i']==1 replace childbirth= .i in`k'
>>
>> I note also that
>>
>> if childbirth[`i']== .f replace childbirth= rbinomial(1,
>> probabilityconceive)
>>
>> -replace-s in every observation, including those earlier declared
>> times when infertile. That can't be what you intend, so you need to
>> specify -in- here too.
>>
>> That said, I don't see that you need to reach for the exotic machinery
>> of extended missing values. Infertility post partum would seem to be
>> represented naturally by 0; the value is known and zero, and for a
>> specific reason, not unknown for a specific reason.
>>
>> Nick
>>
>> On Tue, Aug 7, 2012 at 12:31 AM, Stephen Cranney
>> <[email protected]> wrote:
>>> Thank you all so much, that worked to make the syntax legal. I'm
>>> almost there, but it's not quite doing what I want it to. To recap,
>>> the data is sorted by year and month. When the "birth" is created out
>>> of the binomial function, I want the code to detect it and make a
>>> number of the subsequent months "infertile" so that binomial
>>> probability of births won't work during those months. .f= fertile
>>> missing, .i is missing for after-birth infertility.
>>> "monthsofpostpartum" is a local macro that is simply the number of
>>> months of after-birth infertility. This just gives me a sequence of 1s
>>> and 0s; it doesn't seem to be replacing the subsequent months after
>>> birth with the .i
>>>
>>> local N = _N
>>> local monthsofpostpartum = 12
>>> forvalues i = 1/`N' {
>>> forvalues j= 1/`monthsofpostpartum' {
>>> if childbirth[`i']== .f replace childbirth= rbinomial(1, probabilityconceive)
>>> if childbirth[`i']==1 replace childbirth= .i in`N'+`j'
>>> }
>>> }
>>>
>>> Thanks in advance,
>>>
>>>
>>>
>>> On Mon, Aug 6, 2012 at 1:45 PM, Nick Cox <[email protected]> wrote:
>>>> You still have a problem.
>>>>
>>>> replace childbirth[_n+j]== .i if (childbirth==1) in `i'
>>>>
>>>> is illegal, as explained.
>>>>
>>>> This kind of statement would be legal
>>>>
>>>> if (childbirth[<subscript>] == 1) replace childbirth = .i in <something>
>>>>
>>>> but I am not certain that it is what you want.
>>>>
>>>> On Mon, Aug 6, 2012 at 8:08 PM, Stephen Cranney
>>>> <[email protected]> wrote:
>>>>> But with the current syntax isn't that not a problem? If I input the
>>>>> numbers directly I have the following:
>>>>>
>>>>> local N = _N
>>>>> forvalues i = 1/`N' {
>>>>> forvalues j= 0/12 {
>>>>>
>>>>> replace childbirth= rbinomial(1, probabilityconceive)
>>>>> if childbirth== .f
>>>>> replace childbirth[_n+j]== .i if (childbirth==1) in `i'
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>> Here 1/`N' is directly computed before the loop starts, and the j
>>>>> values are inputted directly (with the higher bound being the number
>>>>> of postpartum months), so I'm still not seeing exactly how the syntax
>>>>> has a problem. I've closed off the space that was between childbirth
>>>>> and the _n, so it's not that it's accidentally recognizing the value
>>>>> as a weight.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Stephen
>>>>>
>>>>> On Mon, Aug 6, 2012 at 11:59 AM, Nick Cox <[email protected]> wrote:
>>>>>>
>>>>>> No "seems to indicate" here: simply, subscripts are not allowed to the
>>>>>> left of the assignment in Stata.
>>>>>>
>>>>>> The syntax diagram shows the form -replace oldvar = exp-. Stuff can
>>>>>> follow that, but nothing else can be included.
>>>>>>
>>>>>> Nick
>>>>>>
>>>>>> On Mon, Aug 6, 2012 at 4:53 PM, Stephen Cranney
>>>>>> <[email protected]> wrote:
>>>>>> > Thanks for catching that; it's still giving me the "weights not
>>>>>> > allowed" error message though, even when I delete the extra space.
>>>>>> >
>>>>>> > I found this prior Statlist post that seems to indicate that Stata
>>>>>> > triggers the no weights allowed warning when the `i' is placed to the
>>>>>> > left of the equals sign:
>>>>>> >
>>>>>> > http://www.stata.com/statalist/archive/2006-08/msg00976.html
>>>>>> >
>>>>>> > So I changed my code to the following, but I'm still getting the "no
>>>>>> > weights allowed" message.
>>>>>> >
>>>>>> > local N = _N
>>>>>> > forvalues i = 1/`N' {
>>>>>> > forvalues j= 0/12 {
>>>>>> > replace childbirth= rbinomial(1, probabilityconceive) if childbirth== .f
>>>>>> > replace childbirth[_n+j]== .i if (childbirth==1) in `i'
>>>>>> > }
>>>>>> > }
>>>>>> >
>>>>>> > Best,
>>>>>> >
>>>>>> >
>>>>>> >
>>>>>> > On Mon, Aug 6, 2012 at 9:32 AM, daniel klein
>>>>>> > <[email protected]> wrote:
>>>>>> >> I did not follow closely, but there is a space between <childbirth>
>>>>>> >> and <[`i']> in your code, probably causing Stata to interpret <[`i']>
>>>>>> >> as some kind of weight, rather than a subscript.
>>>>>> >>
>>>>>> >> Best
>>>>>> >> Daniel
>>>>>> >>
>>>>>> >> --
>>>>>> >> [...]
>>>>>> >> However, when I change the
>>>>>> >> monthsofpostpartum variable to a constant (in this case 12), it's
>>>>>> >> giving me a "weights not allowed" sign.
>>>>>> *
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/