STATA цикл foreach странное поведение - PullRequest
1 голос
/ 24 октября 2009

Я получаю странное поведение (оно генерирует только пропущенные значения) из следующего цикла -

foreach x имени varlist {egen totalcap x'=total(cap) if unit!=0 & name==" x '", (год)}

Но если бы я сделал, просто

egen totalcapSOMENAME = total (cap), если unit! = 0 & name == "SOMENAME", (год)

затем он вычисляет числа, которые он должен вычислить.

Это набор данных панели, единица обозначает число в силовой установке конкретного генераторного агрегата (единицы с номером 0 являются наблюдениями на уровне завода). Переменная cap установленной мощности. Переменная name идентифицирует растение. Сложно объяснить, зачем мне нужен этот цикл, но проблема явно в том, как STATA интерпретирует foreach.

1 Ответ

1 голос
/ 26 октября 2009

У вас есть пара вопросов здесь. Самое главное, что ваш первый цикл оценивает слово «name» вместо «x» во всем цикле. Так что ваша команда -egen- запускается как:

foreach x of varlist name {
     egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}

Я сомневаюсь, что это то, что вы действительно хотите - я думаю, что вы хотите, чтобы оно оценивалось по каждому элементу (наблюдению) в вашей переменной "name", так как вы использовали оператор if name == "x'". So, you need to either get rid of the double quotes around the " x '" в вашем -if- оператор ИЛИ установить локальный макрос и настроить цикл egen для оценки каждого элемента в вашей переменной "name".

Вторая ошибка, которую я вижу в вашем коде, заключается в том, что вы пропускаете кавычку вперед или влево для «x» в цикле - он должен читать «x», а не «x».

Вот пример того, что, я думаю, вы хотите запустить. В целях иллюстрации я использую встроенный в Stata набор данных "auto.dta" для запуска вашего оператора loop & standalone -egen- ... обратите внимание, что я переименую переменные в auto.dta в имена ваших переменных:

***********
clear
sysuse auto


**
//this section renames the auto.dta variables to the name of your variables//

gen year = [_n]
rename mpg cap
rename price unit
rename make name
**NOTE:  your "SOMENAME" will be "Subaru" in this example!**
**

//here's the loop you should be running//

foreach x of varlist name {
 egen totalcap`x'=total(cap) if unit!=0 & name==`x', by(year) 
 }

//without the loop//

egen totalcapSOMENAME=total(cap) if unit!=0 & name=="Subaru", by(year)

//Display the results//

li name unit cap totalcap* if !missing(totalcapSOMENAME)
***********

Попробуйте запустить этот пример в do-файле Stata. Кроме того, когда у вас возникают проблемы такого рода (когда цикл создает другой результат, чем автономная команда), всегда пытайтесь ввести -set trace on-, чтобы вы могли увидеть, как Stata оценивает ваш цикл.

...