Сохранение только случаев с ненулевыми наблюдениями в регрессии с фиксированными эффектами

В настоящее время я работаю с панельными данными SOEP (с 2002 по 2010 годы), и у меня возникли небольшие проблемы. Я пытаюсь запустить регрессию с фиксированными эффектами с надбавкой на ребенка в качестве зависимой переменной и человеко-года в качестве независимой переменной. Я хотел бы включить в выборку только тех, кто выплачивал своему ребенку пособие не менее одного года. Я предполагаю, что люди, которые не давали своему ребенку пособие в любой момент в течение этого периода времени, автоматически исключаются, поскольку регрессия с фиксированными эффектами измеряет в пределах вариации и не включает людей без вариаций в данной переменной ( думаю когорта). Это был бы мой вопрос: xtreg, dvar ivar1 ivar2 ivarx, fe vce(cluster id) автоматически удаляет людей без изменений в данной переменной, или мне нужно вручную исключать их из регрессии? Если да, то как мне бросить этих людей?

Изменить:

Я бы хотел исключить только тех, кто не предоставляет своим детям никаких пособий в течение периода наблюдения, а в том числе тех, кто это делает хотя бы один раз. В итоге я использовал следующий код:

*Generate variable for cases with at least one non-zero value over the observation period 
bysort id (year): egen sumofallowance= sum(childallowance) 

*Run a fixed effects regression using this variable as a condition.
xtreg childallowance idyear if sumofallowance>0, fe vce(cluster id)

Я не был уверен, будет ли Stata делать это автоматически, но оказалось, что Stata этого не делает, поскольку у меня примерно на 9000 наблюдений меньше.


person Alec MacDonald    schedule 16.06.2021    source источник


Ответы (1)


Если вы знаете свой образец, на котором вы хотите запустить регрессию, всегда рекомендуется явно ограничить регрессию этим образцом. Особенно, если у вас нет точного понимания того, как используемая вами команда работает без вариаций, пропущенных значений и т. Д. это делает ваш код более читабельным для других людей, которые также могут не понимать эту команду.

Я бы посоветовал вам создать переменную с именем типа sample, для которой вы установили значение 1 для всех наблюдений, которые вы хотите включить в регрессию, а затем ограничить xtreg этой выборкой. В вашем случае это будет примерно так:

*Create a variable that is 1 for the intended sample
gen sample = (dvar > 0 & !missing(dvar)) // Sets sample = 1 if non-zero and non-missing, otherwise set to 0

*Run regression restricted to sample
xtreg dvar ivar1 ivar2 ivarx if sample == 1, fe vce(cluster id)

Возможно, вам придется отредактировать строку, которая генерирует sample, в зависимости от формата данных в dvar.

Наконец, xtreg может отбросить наблюдения по другим причинам, поэтому убедитесь, что N в регрессиях соответствует числу 1, которое вы получаете в tab sample, m, и убедитесь, что это также соответствует вашим ожиданиям от выборки, которую вы имеете в виду.

person TheIceBear    schedule 16.06.2021
comment
Спасибо за отзыв! Я студент и все еще изучаю Stata, и это было полезно. Я придумал способ включить наблюдения, по крайней мере, с одним ненулевым значением, так как я все же хотел бы сохранить в выборке людей, которые, возможно, не давали никаких скидок в какой-то момент в течение периода наблюдения (см. Редактирование). - person Alec MacDonald; 16.06.2021
comment
Хорошая адаптация! Тем не менее, один комментарий, поскольку вы, кажется, хотите изучить передовой опыт. Будьте лаконичны в отношении правил именования. Теперь значения в переменной sample - это сумма, но любой, читающий ваш код, ожидает фиктивного значения. Как насчет bysort id (year): egen sum_childallowance = total(childallowance) (total() дает вам то, что вы хотите, не sum() см. help egen), а затем gen sample = (sum_childallowance > 0 & !missing(sum_childallowance)). Это делает ваш код немного длиннее, но гораздо более читабельным, что является хорошей практикой в ​​исследованиях. Кроме того, проголосуйте за и примите мой ответ, если он был полезен. - person TheIceBear; 16.06.2021
comment
Я на самом деле назвал переменную childallowancesum, но оставил здесь общее название на тот случай, если кто-то будет искать общий код. Кроме того, у меня недостаточно «репутации», чтобы проголосовать за, но Stack Overflow говорит, что мой отзыв был отмечен! - person Alec MacDonald; 16.06.2021
comment
Ок, отлично. Спасибо, что приняли ответ. Вам все равно следует изменить sum() на total(). sum() - это текущая сводка, которая суммирует только строки над этой строкой, а не все строки для этого идентификатора. total() суммирует все строки для этого идентификатора. См. Пример внизу help egen, который объясняет это. Затем я по-прежнему рекомендую промежуточный шаг sample с !missing(sumofallowance), поскольку тогда вы лучше обрабатываете отсутствующие значения, поскольку sumofallowance>0 будет включать отсутствующее значение в sumofallowance. Такие наблюдения будут исключены, так как childallowance будет отсутствовать в этой строке, но лучше указать явно. - person TheIceBear; 16.06.2021