【发布时间】:2014-02-25 09:35:26
【问题描述】:
我有一个不平衡的面板数据集(国家和年份)。为简单起见,假设我正在测量一个变量 x。面板数据首先按国家(3 位数字国家代码)排序,然后按年份排序。我想编写一个 .do 文件来生成一个新变量 z_x,其中包含变量 x 的标准化值。变量应该通过从前面(不包括)m 个时间段中减去平均值,然后除以这些相同时间段的标准差来标准化。如果这不可能,则返回缺失值。
目前,我用来完成此操作的代码如下(现在为清晰起见编辑)
xtset weocountrycode year
sort weocountrycode year
local win_len = 5 // Defining rolling window length.
quietly: rolling sd_x=r(sd) mean_x=r(mean), window(`win_len') saving(stats_x, replace): sum x
use stats_x, clear
rename end year
save, replace
use all_data_PROCESSED_FINAL.dta, clear
quietly: merge 1:1 (weocountrycode year) using stats_x
replace sd_x = . if `x'[_n-`win_len'+1] == . | weocountrycode[_n-`win_len'+1] != weocountrycode[_n] // This and next line are for deleting values that rolling calculates when I actually want missing values.
replace mean_`x' = . if `x'[_n-`win_len'+1] == . | weocountrycode[_n-`win_len'+1] != weocountrycode[_n]
gen z_`x' = (`x' - mean_`x'[_n-1])/sd_`x'[_n-1] // calculate z-score
更新:
我与滚动的斗争是,当滚动设置为使用窗口长度 5 滚动平均值时,它会自动为第一个、第二个、第三个和第四个条目执行窗口长度 1、2、3、4 的平均值(当有没有 5 个之前的条目可用于平均)。事实上,它通常这样做 - 如果第一个非缺失值在条目 5 上,它将在条目 5 上执行长度 1 滚动平均,在条目 6 上执行长度 2 滚动平均,......然后最后开始在条目 9 上做长度为 5 的移动平均线。我的问题是我不想要这个,所以我想避免执行这些计算。直到现在,我也只能想办法删除它们后如何删除它们,既低效又麻烦。
我尝试在 -rolling- 语句中添加一个 if 子句:
quietly: rolling sd_x=r(sd) mean_x=r(mean) if x[_n-`win_len'+1] != . & weocountrycode[_n-`win_len'+1] != weocountrycode[_n], window(`win_len') saving(stats_x, replace): sum x
但它并没有解决问题,并且输出在某种意义上是“奇怪的”
1) 如果 `win_len' 等于 10,则生成的 z_x 变量中有 15 个缺失值,而不是 9 个。 2) 即使 z_x 中存在“额外的”缺失值,观察结果仍然以窗口长度 1 的意思开始,然后窗口长度 2 的意思等等,这对我来说毫无意义。
这让我相信我根本不明白 1) -rolling- 在做什么以及 2) if 子句如何在 -rolling- 的上下文中工作。
这有帮助吗?
谢谢!
【问题讨论】:
-
事实上,这里的细节太多了,不合我的口味。你能用一句话来区分
rolling没有做你想做的事或做了你不想做的事吗? -
以上更新。一句话:当它不能真正做到我要求它做的事情时,滚动尝试做一个平均;我宁愿它在数据不可用时只返回一个缺失值,但它只是尝试使用它可用的东西。
-
如果你把
r(N)的结果保存在summarize之后你可以replace其他基于不完整窗口的结果被遗漏。 -
那么,没有办法滚动简单地不计算这些值吗?这浪费了很多时间并打印了很多电子版。
-
您可以在
rolling前加上quietly或使用nodots选项来禁止显示。与尝试解决您不喜欢的问题所花费的时间相比,您能否量化额外的计算时间?
标签: stata