Повторение кода в квалификаторе if в Stata - PullRequest
0 голосов
/ 17 июня 2020

В Stata я пытаюсь повторить код внутри квалификатора if, используя, возможно, forvalues l oop. Мой код выглядит примерно так:

gen y=0

replace y=1 if x_1==1 & x_2==1 & x_3==1 & x_4==1 

Вместо того, чтобы каждый раз писать оператор & x_i==1 для каждой переменной, я хочу делать это с помощью al oop, примерно так:

gen y=0

replace y=1 if forvalues i=1/4{x_`i'==1 &}

ПОЗДНЕЕ РЕДАКТИРОВАНИЕ:

Можно ли было бы создать локальный объект в строке this со сложенными вместе элементами:

forvalues i=1/4{

    local text_`i' "x_`i'==1 &"

    display "`text_`i''"
    }

А затем вызвать его в квалификаторе if?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Обычно я не люблю - в терминах Ника - писать код для написания кода. Я вижу немедленное, хотя и не изящное и не «неортодоксальное» решение вашей проблемы. Все это сводится к тому, чтобы сгенерировать индикаторную функцию для всех ваших индикаторов и использовать ее с квалификатором if. , и вам нужно, чтобы они были == 1, и 2) имена переменных удобно упорядочены от 1 до N (хотя, если это не так, вы можете легко изменить forv на 'foreach var of varlist et c. ')

g touse = 1

forv i =1/30{

  replace touse = touse * x_'i' 

}

<your action> if touse == 1

0 голосов
/ 17 июня 2020

Хотя вы используете термин «if оператор», весь ваш код сформулирован в терминах квалификаторов if, которые не являются командами или операторами. (Вы используете термин «оператор» более свободно, чем обычно, но это не влияет напрямую на ответ.)

Вы не можете вставлять циклы в квалификаторы if.

См. Различия

help if 
help ifcmd 

Весь пример

gen y = 0
replace y = 1 if x==1 | x==2 | x==3 | x==4 

будет лучше как

gen y = inlist(x, 1, 2, 3, 4) 

или (в зависимости от того, что допустимые значения)

gen y = inrange(x, 1, 4) 

Решение l oop может быть

gen y = 0 

quietly forval i = 1/4 { 
    replace y = 1 if x == `i' 
} 

Мы не можем обсуждать, будет ли inlist() или inrange() решением или нет для вашей реальной проблемы, если вы не покажете нам.

...