stata - 以现有变量和变量列表为条件的变量操作

时间:2013-09-08 09:55:58

标签: stata

我有这个问题。 我的数据集包含如下变量:

sec20_var1 sec22_var1 sec30_var1 sec20_var2 sec22_var2 sec30_var2 sec31_var2

(~102个扇区,~60个变量,并非所有的组合都完整或甚至存在)

我的目的是建立一个指标来平均显示行业内的变量。因此,它是一个“聚合部门”,包含属于高中低技术时代的一类部门。我已经有了每个类别中应包含哪些部门的定义。让我们说,在高科技我应该把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中存在所有扇区的变量(这更简单,因为我不必将varlist存储在宏中)。我想做一个AVAILABLE扇区的平均值,即使每个变量只有两个。

我还注意到宏存储可能会有所帮助,但我不知道如何将它放入我的代码中。我完全被困在这里了。

感谢您的帮助! :)

2 个答案:

答案 0 :(得分: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 }

s'

请注意,我删除了变量列表。

答案 1 :(得分:0)

我会将您所指的变量称为“帐户”。

解决方法是在数据集中为所有sectorXaccount组合创建空变量。从已经将数据集加载到内存中的那一点开始:

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个等等)所以你需要小心那些(但你可能已经知道了这一点)。