Добавление наблюдений на панель в Stata - PullRequest
0 голосов
/ 28 августа 2018

У меня есть данные панели за год t1 до t2. Некоторые люди вводят образец после t1 и / или выходят из образца до t2. Для эффективности (большая выборка) набор данных содержит строки только для тех лет, когда наблюдаются отдельные лица.

Я хочу добавить новое наблюдение для каждого человека, содержащее год после , когда человек оставил выборку. Итак, если кто-то ушел, скажем, в 2003 году, я хочу, чтобы новое наблюдение содержало идентификатор человека и значение 2004 в переменной year. Любая другая переменная в этом наблюдении должна отсутствовать.

Это мой подход с использованием образца набора данных:

webuse nlswork, clear

* Here goes plenty of lines of codes modifying the dataset ... for generality *

timer on 1

preserve
keep id year
bysort id (year) : keep if _n == _N
replace year = year + 1
save temp.dta, replace
restore

append using temp.dta
sort id year
erase temp.dta

timer off 1
timer list 

Я думаю, что это может быть немного неэффективно, поскольку включает сохранение / восстановление, сохранение / удаление дополнительной базы данных и добавление, все относительно длительные действия. Что-то вроде tsfill, last было бы удивительно, но такой опции не существует. Кто-нибудь знает о более эффективном методе? Приведенный выше код включает таймер, поэтому любой может сравнить его с другим методом.

1 Ответ

0 голосов
/ 28 августа 2018

Меня никогда не впечатляли попытки сэкономить секунды, когда кодирование занимает минуты. Это более прямо, чем ваш подход.

bysort id (year) : gen byte last = _n == _N 
expand 2 if last 
bysort id (year) : replace year = year + 1 if _n == _N 

РЕДАКТИРОВАТЬ: вам нужно перебрать другие переменные в вашем наборе данных, чтобы заменить их значения отсутствующими. Для простоты предположу, что все они числовые.

bysort id (year) : replace last = _n == _N 
ds id year, not 
quietly foreach v in `r(varlist)' { 
    replace `v' = . if last 
}
...