我想通过编写 Stata 代码来获得运行最大值。
我觉得我很接近:
gen ctrhigh`iv' = max(ctr, L1.ctr, L2.ctr, L3.ctr, ..., L`iv'.ctr)
如您所见,我的数据是时间序列,`iv'
代表窗口(例如 5、10 或 200 天)
唯一的问题是您不能将包含数字的 varlist 或字符串传递给 max
。例如。以下是不可能的:
local ivs 5 10 50 100 200
foreach iv in `ivs' {
local vals
local i = 1
while (`i' <= `iv') {
vals "`vals' `i'"
local ++i
}
gen ctrhigh`iv' = max(varlist vals) //not possible
}
我该如何实现呢?
快速计算运行标准偏差的示例
* standard deviation of ctr, see http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods *
gen ctr_sq = ctr^2
by tid: gen ctr_cum = sum(ctr) if !missing(ctr)
by tid: gen ctr_sq_cum = sum(ctr_sq) if !missing(ctr_sq)
foreach iv in $ivs {
if `iv' == 1 continue
by tid: gen ctr_sum = ctr_cum - L`iv'.ctr_cum if !missing(ctr_cum) & !missing(L`iv'.ctr_cum)
by tid: gen ctr_sq_sum = ctr_sq_cum - L`iv'.ctr_sq_cum if !missing(ctr_sq_cum) & !missing(L`iv'.ctr_sq_cum)
by tid: gen ctrsd`iv' = sqrt((`iv' * ctr_sq_sum - ctr_sum^2) / (`iv'*(`iv'-1))) if !missing(ctr_sq_sum) & !missing(ctr_sum)
label variable ctrsd`iv' "Rolling std dev of close ticker rank by `iv' days."
drop ctr_sum ctr_sq_sum
}
drop ctr_sq ctr_cum ctr_sq_cum
注意:这不是一个精确的 sd,它是一个近似值。我意识到这与最大值有很大不同,但这可以作为如何处理大数据计算的说明。
最佳答案
您的示例是时间序列数据,这意味着您有 tsset
数据。你不说你是否也有面板或纵向结构。我将假设最坏的情况并假设后者,因为它不会使代码变得更糟。所以,假设 tsset id date
。事实上,这与此处的代码无关,只是明确地假设 id
是一个标识符,date
是一个时间变量。
执行此操作的一种没有吸引力的方法是循环观察。假设窗口设置为 42。
local window = 42
gen max = .
tsset id date
quietly forval i = 1/`=_N' {
su ctr if inrange(date, date[`i'] - `window', date[`i']) & id == id[`i'], meanonly
replace max = r(max) in `i'
}
因此,用文字来说也是如此:总结
ctr
的值,如果 date
在窗口内 并且它在相同的面板(相同的 id
),并将最大值放在当前观察中。
meanonly
选项没有正确命名。它计算除均值之外的一些其他量,最大值是一个。但是您确实希望 meanonly
选项使 summarize
尽可能快。
请参阅我 2007 年关于间隔事件的论文,可在 http://www.stata-journal.com/sjpdf.html?articlenum=pr0033 免费获得
我说没有吸引力,但这种方法确实有一个优点,一旦你理解它就很容易使用。
我没有为 max()
设置一个包含大量参数的表达式。您以 200 为例,没有说明您可能不会要求更多,据我所知,窗口长度可能没有上限,但表达式的复杂程度会有限制。
如果我想到更好的方法,我会发布。或者其他人会....
关于algorithm - 如何在 Stata 中获得最大运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16244946/