【问题标题】:Generating rolling z-scores of panel data in Stata在 Stata 中生成面板数据的滚动 z 分数
【发布时间】: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


【解决方案1】:

我不确定我是否完全理解,但我会尝试根据我认为您的问题以及@NickCox 的评论来回答。

你说:

...当滚动设置为使用窗口长度 5 滚动时... 如果第一个非缺失值是 在条目 5 上,它将在条目 5、长度 2 上执行长度 1 滚动平均 条目 6 的滚动平均值,...

这是意料之中的。 help rolling 状态:

窗口大小是指日历周期,而不是数字 观察。如果有 缺少数据(例如,由于周末),命令使用的实际观察次数可能少于 窗口(#)。

它实际上并不是在做“长度为 1 的滚动平均”,但我稍后会谈到。 下面是一些例子,看看rolling 做了什么:

clear all
set more off

*-------------------------- example data -----------------------------

set obs 92

gen dat = _n - 1
format dat %tq

egen seq = fill(1 1 1 1 2 2 2 2)

tsset dat

tempfile main
save "`main'"

list in 1/12, separator(4)


*------------------- Example 1. None missing ------------------------

rolling mean=r(mean), window(4) stepsize(4) clear: summarize seq, detail
list in 1/12, separator(0)


*------- Example 2. All but one value, missing in first window ------

use "`main'", clear
replace seq = . in 1/3
list in 1/8

rolling mean=r(mean), window(4) stepsize(4) clear: summarize seq, detail
list in 1/12, separator(0)


*------------- Example 3. All missing in first window --------------

use "`main'", clear
replace seq = . in 1/4
list in 1/8

rolling mean=r(mean), window(4) stepsize(4) clear: summarize seq, detail
list in 1/12, separator(0)

请注意,我使用stepsize 选项使事情更容易理解。因为日期变量以季度为单位,所以我设置了windowsize(4)stepsize(4),所以rolling 只是按年份计算平均值。我希望这很容易看到。

  • 示例 1 符合预期。这里没问题。

  • 另一方面,
  • 示例 2 对您来说应该更有趣。我们已经说过重要的是日历周期,因此即使包含缺失值,也会计算全年(四个季度)的平均值。有 3 个缺失和 1 个未缺失。 summarize 正在计算全年的平均值,但 summarize 忽略了缺失值,因此它只输出非缺失值的平均值,在这种情况下它只是一个值。

  • 示例 3 缺少一年中所有四个季度的数据。因此,summarize 输出 .(缺失)。

据我了解,您的问题是,当您遇到像 示例 2 这样的情况时,您希望输出丢失。这就是我认为 Nick Cox 的建议的用武之地。您可以尝试以下方法:

rolling mean=r(mean) N=r(N), window(4) stepsize(4) clear: summarize seq, detail
replace mean = . if N != 4
list in 1/12, separator(0)

这表示:如果窗口的非缺失数(r(N),也由 summarize 计算)与窗口大小不同,则将其替换为缺失。

【讨论】:

  • 你很好地理解了我的观点。顺便说一句,如果您想要从 summarize 得到的只是计数和平均数,那么您不需要 detail 选项;相反,您可以申请meanonly。 OP 也想要 SD,所以这与这里的主要问题无关。
  • 太好了,感谢您的回复。上述方法仍在计算所有值,稍后将替换为缺失值。有谁知道是否有办法避免这种情况?看起来很浪费,Stata打印到控制台的红色字母“e”很麻烦。
  • 不客气。就像我说的,summarize 只是忽略了缺失。这就是它的工作方式。这比在有非缺失值时输出缺失更有意义。在这里使用replace 似乎不足以证明该策略是浪费的。
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多