algorithm - 如何在 Stata 中获得最大运行?

标签 algorithm max stata

我想通过编写 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/

相关文章:

matlab - 返回表中每个子组的最大值

stata - 如何准备数据集以在stata中使用mixlogit

stata - 从具有重叠的长数据集中确定每个时期的独特处方数量

c++ - n 皇后 (n > 1000) 的快速启发式算法

java - Java中的快速双值优先级队列实现

c - 之字形树打印

linux - 在 Sublime Text 3 中,我可以将选择的 do 文件发送到 Stata 吗?

algorithm - MATLAB - 网格特定区域中随机索引的排列

algorithm - 使用多个 CPU 查找最大数量的最短时间

sql - 在两个表之间使用 MAX 聚合