Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中向量的指数移动平均_R_Ttr - Fatal编程技术网

R中向量的指数移动平均

R中向量的指数移动平均,r,ttr,R,Ttr,我有一个简单的向量,如下所示: x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64) 我试图用下面的函数找到这个向量的滚动EMA- library(TTR) y = EMA(x, 5) 我得到的结果如下- [1] NA NA NA NA 13.33400 13.22267 13.52844 14.44563 16.51042 16.88695 然而,我希望结果

我有一个简单的向量,如下所示:

x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)
我试图用下面的函数找到这个向量的滚动EMA-

library(TTR)
y = EMA(x, 5)
我得到的结果如下-

 [1]     NA     NA     NA     NA 13.33400 13.22267 13.52844 14.44563 16.51042 16.88695
然而,我希望结果如下-

 [1]     14.24 14.03 13.06 13.43 13.33400 13.22267 13.52844 14.44563 16.51042 16.88695
第一个值应与原始向量中的值相同 第二个值应为第一个和第二个值的EMA 第三个值应为初始三个值的EMA 矢量 第四个值应该是向量中初始四个值的EMA 其余的计算由函数EMA正确处理

我尝试过的解决方案-

运行以下命令- rollapplyrx,width=5,FUN=EMA,partial=TRUE将给出错误,因为EMA有自己的滚动窗口

使用函数stats::filter可以工作,但答案不正确,因为我不确定ratio参数的正确值。 这是一个自定义函数


谢谢

这将提供所需的结果:

require(TTR)

x <- c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)

rollmeanEMA <- function(vec, len) {
  c(cumsum(vec[1:(len-1)]) / seq_along(vec[1:(len-1)]),
    EMA(vec, len)[len:length(vec)])
}

rollmeanEMA(x,5)
#[1] 14.24000 14.03000 13.60333 13.43250 13.33400 13.22267 13.52844 14.44563
#[9] 16.51042 16.88695

这将产生预期的结果:

require(TTR)

x <- c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)

rollmeanEMA <- function(vec, len) {
  c(cumsum(vec[1:(len-1)]) / seq_along(vec[1:(len-1)]),
    EMA(vec, len)[len:length(vec)])
}

rollmeanEMA(x,5)
#[1] 14.24000 14.03000 13.60333 13.43250 13.33400 13.22267 13.52844 14.44563
#[9] 16.51042 16.88695
查看显示,第一个值是平均窗口的平均值:

    /* Raw mean to start EMA */
    double seed = 0.0;
    for(i = first; i < first + i_n; i++) {
      d_result[i] = NA_REAL;
      seed += d_x[i] / i_n;
    }
    d_result[first + i_n - 1] = seed;
此短向量上的计算开销最小,而在较长向量上的计算开销更大:

microbenchmark::microbenchmark(TTR::EMA(x,5),EMA2(x,5),times=1000)

#> Unit: microseconds
#>           expr   min    lq     mean median     uq   max neval cld
#> TTR::EMA(x, 5) 157.7 161.8 181.6156  164.0 180.55 593.5  1000  a 
#>     EMA2(x, 5) 164.2 167.5 193.0643  170.6 193.20 857.1  1000   b
查看显示,第一个值是平均窗口的平均值:

    /* Raw mean to start EMA */
    double seed = 0.0;
    for(i = first; i < first + i_n; i++) {
      d_result[i] = NA_REAL;
      seed += d_x[i] / i_n;
    }
    d_result[first + i_n - 1] = seed;
此短向量上的计算开销最小,而在较长向量上的计算开销更大:

microbenchmark::microbenchmark(TTR::EMA(x,5),EMA2(x,5),times=1000)

#> Unit: microseconds
#>           expr   min    lq     mean median     uq   max neval cld
#> TTR::EMA(x, 5) 157.7 161.8 181.6156  164.0 180.55 593.5  1000  a 
#>     EMA2(x, 5) 164.2 167.5 193.0643  170.6 193.20 857.1  1000   b

那是因为它打了6次电话。通过单独调用EMA来填充NAs。为了获得更好的运行时,您可能必须破解EMA本身。在一个高性能、大量使用的应用程序中,这样做是值得的。如果你只是每分钟调用一次函数,这可能是可以忍受的。如果你的运行是独立的,你可以将它们放在一个并行环境中,使用parSapply。看这里,我认为用一个简单的平均值替换NA部分是很好的。将函数第4行中的EMAx,i[i]替换为meanx[1:i]。肯定测试结果,但我认为应该是相等的。如果这给了你正确的值,我可以把它加入到答案中。可能会使它再次变慢:无法用当前方法进一步优化它。这是因为它调用了6次。通过单独调用EMA来填充NAs。为了获得更好的运行时,您可能必须破解EMA本身。在一个高性能、大量使用的应用程序中,这样做是值得的。如果你只是每分钟调用一次函数,这可能是可以忍受的。如果你的运行是独立的,你可以将它们放在一个并行环境中,使用parSapply。看这里,我认为用一个简单的平均值替换NA部分是很好的。将函数第4行中的EMAx,i[i]替换为meanx[1:i]。肯定测试结果,但我认为应该是相等的。如果这给了你正确的值,我可以把它加入到答案中。可能会再次使其变慢:无法使用当前方法对其进行进一步优化。似乎cumsumx[1:n-1]/1:n-1正在计算初始n值的简单移动平均SMA,而对于剩余值,则计算EMA。我的理解正确吗?是的,这是正确的,我检查了EMA是否完全执行相同的操作。请调整函数以处理NA值?这里是一个示例向量x=cNA,NA,14.24,13.82,12.75,12.92,12.94,13.00,14.14,16.28,20.64,17.64。在这个向量上运行EMA2函数最初会生成所有NA值。为引导NAS2而调整谢谢!EMA2现在对具有前导NA值的向量非常有效。看起来cumsumx[1:n-1]/1:n-1正在计算初始n值的简单移动平均SMA,而对于剩余值,则计算EMA。我的理解正确吗?是的,这是正确的,我检查了EMA是否完全执行相同的操作。请调整函数以处理NA值?这里是一个示例向量x=cNA,NA,14.24,13.82,12.75,12.92,12.94,13.00,14.14,16.28,20.64,17.64。在这个向量上运行EMA2函数最初会生成所有NA值。为引导NAS2而调整谢谢!EMA2现在对具有前导NA值的向量非常有效。
x = c(NA, NA, 14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)
EMA2(x,5)
#> [1]       NA       NA 14.24000 14.03000 13.60333 13.43250 13.33400 13.22267 13.52844 14.44563
#> [11] 16.51042 16.88695
microbenchmark::microbenchmark(TTR::EMA(x,5),EMA2(x,5),times=1000)

#> Unit: microseconds
#>           expr   min    lq     mean median     uq   max neval cld
#> TTR::EMA(x, 5) 157.7 161.8 181.6156  164.0 180.55 593.5  1000  a 
#>     EMA2(x, 5) 164.2 167.5 193.0643  170.6 193.20 857.1  1000   b