1

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

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"
            }
}
}
}

我让它只适用于那些在总行中存在所有扇区的变量(这更简单,因为我不必将 varlist 存储在宏中)。我想做一个可用扇区的平均值,即使每个变量只有两个。

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

谢谢你的帮助!:)

4

2 回答 2

1

谢谢@SOConnell。正如我在评论中所说,我朝着同一个方向前进,但我仍在寻找我期望的解决方案(我不知道如何对其进行编程,或者即使它是可能的)。

我使用了这段代码,与@SOConnell 编写的代码方向相同,但我发现这个代码更清晰。诀窍是_rc==111捕获缺少的扇区_X_变量组合并完成它们,目标是在第二部分中使用蜜蜂。一切正常。它并不优雅,但它有一些实际用途。:) 第三部分删除了创建的缺失变量。

*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 }

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

于 2013-09-11T06:20:51.090 回答
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 个等),因此您需要小心(但您可能已经意识到这一点)。

于 2013-09-08T15:23:38.860 回答