2013-09-08 2 views
1

У меня есть эта проблема. Мой набор данных имеет такие переменные, как:stata - переменные операции, условные к существующим vars и списку varnames

sec20_var1 sec22_var1 sec30_var1 sec20_var2 sec22_var2 sec30_var2 sec31_var2

(~ 102 секторов, ~ 60 переменных, не все cominations являются полными или даже отсутствуют)

Мое намерение для создания индикатора, который делает среднее значение переменных в секторе. Таким образом, это «агрегированный сектор», который содержит сектора, принадлежащие к классу, с использованием технологии высоких технологий с низким уровнем дохода. У меня уже есть определения того, какие сектора должны включать в каждую категорию. Скажем, в высоких технологиях я должен поставить sec20 и sec31.

Проблема: список секторов, принадлежащих классу, и фактические сектора, доступные для каждой переменной, не совпадают. Поэтому я застрял в этой проблеме и начал делать это вручную. Мой лучший подход:

set more off 
foreach v in _var02 { 
    ds *`v' 
    di "`r(varlist)'" 
    local sects`v' `r(varlist)' 
     foreach s in sec26 sec28 sec37 { 
     capture confirm local sects`v' 
     if !_rc { 
      egen oecd_medhigh_avg_`v'=rowmean(`s'`v' sec28`v' sec37`v' sec40`v' sec59`v' sec92`v' sec54`v' sec55`v' sec48`v' sec50`v' sec53`v' sec4`v' sec5`v' sec6`v')    
    else { 
     di "`v' didnt existed" 
      } 
} 
} 
} 

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

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

Благодарим за помощь! :)

+0

@ Rho - вы смогли понять это? Был ли мой ответ полезным или вы все еще застряли? – SOConnell

+0

@SOConnell> Спасибо большое! Я тоже разместил свою работу. Я до сих пор не знаю, возможно ли «элегантное» решение без создания пропусков. Приветствия! – Rho

ответ

0

Я буду называть то, что вы называете переменными, как «учетные записи».

Обходным путем было бы создание пустых переменных в наборе данных для всех комбинаций сектораXaccount. С момента, когда вы уже ваш набор данных загружается в память:

forval sec = 1/102 { 
    forval account = 1/60 { 
    cap gen sec`sec'_var`account'=. /*this will skip over generating the secXaccount combination if it already exists in the dataset */ 
    } 
} 

Затем нанесите rowmean операцию полного определения каждого показателя. Пропуски не будут вычисляться в ваш rowmean, поэтому он будет эффективно представлять собой среднее количество доступных ячеек, если вы не сделаете выбор вручную. Вы могли бы, вероятно, автоматизировать удаление пустых переменных, которые вы создали, если вы делаете что-то вроде:

g start=. 
forval sec = 1/102 { 
    forval account = 1/60 { 
    cap gen sec`sec'_var`account'=. /*this will skip over generating the secXaccount combination if it already exists in the dataset */ 
    } 
} 
g end=. 

[indicator calculations go here] 

drop start-end 

Тем не менее, кажется, что вы бы создать средние, которые не могут быть сопоставимы (некоторые из них будут иметь 2 базовые значения, некоторые 3, некоторые 4 и т. д.), поэтому вам нужно быть осторожным там (но вы, вероятно, уже знаете об этом).

+0

Возможно, мне не хватает здесь точки, но я не вижу преимущества в создании переменных, просто чтобы содержать пропуски, которые затем будут проигнорированы. Что не так, просто ищет правильный шаблон? –

+0

Да; мой ответ более обходным путем. Это определенно некрасиво. Я как бы понял, что ОП уже продумал это с помощью подстановочных знаков. Возможно, это более простой и элегантный способ на этом. – SOConnell

+0

Привет! Большое спасибо. Я действительно решил это, также с аналогичным обходным решением, которое заключается в том, чтобы заполнить набор данных отсутствующими переменными (которые будут исключены в rowmean). Я не был «счастлив», хотя потому, что хотел сделать это с конкретными ссылками на фактические переменные (только существующие ... потому что у меня есть stata-se, и я очень близок к пределу 5000vars!). Итак, моя идея состояла в том, чтобы сохранить список доступных переменных в макросе, а затем «сделать совпадение» со списком «идеальных категорий» (какие комбинации не обязательно существуют в наборе данных). Я все еще не знаю, возможно ли это. :) – Rho

1

Спасибо @SOConnell. Как я уже сказал в своем комментарии, я пошел в том же направлении, но я все еще ищу решение, которое я ожидал (что я не умею программировать или даже если это возможно).

Я использовал этот код, который идет в том же направлении, что и сделанный @SOConnell, но я нашел это еще более понятным. Фокус в том, что _rc==111, который улавливает недостающие комбинации Sector_X_variable и заканчивает их с целью использования во второй части. Все сработало. Это не элегантно, но имеет практическое применение. :) Третья часть стирает отсутствующие переменные.

*COMPLETING THE LIST OF COMBINATIONS set more off foreach v in _var02 _var03 _var08 _var13 _... { foreach s in sec27 sec35 sec42 sec43 sec45 sec46 sec39 sec52 sec67 { capture confirm variable s'v' if _rc==111 { gen s'v'=. } } } *GENERATING THE INDICATOR WITH ALL POSSIBLE COMBINATIONS set more off foreach v in _var02 _var03 _var08 _var13 ... { egen oecd_high_avg_v'=rowmean(sec27v' sec35v' sec42v' sec43v' sec45v' sec46v' sec39v' sec52v' sec67v') } *DROPPING MISSING VARIABLES CREATED TO DO THE INDICATOR. set more off foreach v of varlist * { gen TEMP=. replace TEMP=1 if !missing(v') egen TEMPSUM=sum(TEMP) if TEMPSUM==0 { di " >>> Dropping empty variable:v'" drop `v' } drop TEMP TEMPSUM }

Обратите внимание, что я Сокращенный список переменных.