STATA цикл foreach странное поведение
Вопрос
Я получаю странное поведение (оно генерирует только пропущенные значения) из следующего цикла -
foreach x имени varlist {egen totalcap
x '= total (cap) if unit! = 0 & amp; name == "
x '" ;, (год)}
Но если бы я должен был сделать просто
egen totalcapSOMENAME = общее (ограничение), если единица измерения = 0 & amp; name == " SOMENAME " ;, (год)
затем он вычисляет числа, которые он должен вычислить.
Это набор данных панели, единица обозначает число в силовой установке конкретного генераторного агрегата (единицы с номером 0 являются наблюдениями на уровне завода). Переменная cap установленной мощности. Переменная name идентифицирует растение. Сложно объяснить, зачем мне нужен этот цикл, но проблема явно в том, как STATA интерпретирует foreach.
Решение
У вас есть пара вопросов здесь. Самое главное, что ваш первый цикл оценивает слово «имя» вместо "x" на протяжении всей вашей петли. Поэтому он запускает вашу команду -egen- как:
foreach x of varlist name {
egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}
Я сомневаюсь, что это то, что вы действительно хотите - я думаю, что вы хотите, чтобы оно оценивалось по каждому элементу (наблюдению) в вашем " имени " переменная, поскольку вы использовали имя оператора if == " x '" ;. Итак, вам нужно либо избавиться от двойных кавычек вокруг "
x '" в вашем операторе -if- ИЛИ установите локальный макрос и настройте цикл egen для оценки каждого элемента в вашем " имени " переменная. Р>
Вторая ошибка, которую я вижу в вашем коде, заключается в том, что вы пропускаете прямую или левую кавычку для " x " в цикле - это должно читаться как "x" " , а не "x" ".
Вот пример того, что, я думаю, вы хотите запустить. Для наглядности я использую встроенный Stata " auto.dta " набор данных для запуска вашей петли & amp; автономный оператор -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 оценивает ваш цикл.