从r中的循环数据计算移动平均值

时间:2018-06-08 10:53:09

标签: r moving-average arima

我想从一系列角度(β)计算弧度(theta)的平均角度,这些角度存储在名为“a”的数据框中:

       time beta    theta           theta2
    1   0           na              na
    2   2.426551575 na              na 
    3   5.890842799 0.678069689     0.678069689
    4   0.530641823 0.854950297     0.854950297
    5   4.794960386 -0.449975202    5.833210105
    6   1.271620156 0.104679019     0.104679019
    7   5.789548201 -0.236747291    6.046438017
    8   1.053579352 0.610520801     0.610520801
    9   0.095112206 0.218351484     0.218351484
    10  6.108843722 0.324783324     0.324783324

beta是以弧度为单位,并且是从包裹的gauchy分布中随机抽取而生成的。我想计算thetas(实际上是theta2,以弧度表示)。我通过蛮力做了这些,将弧度转换为正/负单位,pi / -pi为180度,但正在寻找更优雅的方法。

我曾希望这会起作用(调用circular和dplyr包):

a$theta<-mean.circular(c(a$beta,lag(a$beta),lag(a$beta,2))

但这似乎只能返回beta的最后一个值。我已经尝试了子集,也在循环中(我有另一个称为时间的字段是递增整数)

    time    beta
    1   0
    2   2.426551575
    3   5.890842799
    4   0.530641823
    5   4.794960386
    6   1.271620156
    7   5.789548201
    8   1.053579352
    9   0.095112206
   10   6.108843722



theta<-0
bset<-c(0,0,0)
for (i in time){
  bset<-ifelse(i<3,bset,df$beta[(i-2):i])
  thetai<-mean.circular(bset)
  theta<-c(theta,ifelse(is.na(thetai),0,thetai))

theta<-theta[2:(length(time)+1)]
df<-cbind(df,theta)
}

但这也行不通。谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

我相信如果我理解正确,那么你正在尝试计算本质上是循环的数据的移动平均值。如果是这种情况,您可以选择栅格的movingFun函数来获取移动平均线。由于mean本质上没有矢量化,因此它总是会返回一个值。

如果粘贴所需的输出会很好。

在这里,我选择滞后值为2,循环性质为真。

library(raster)
movingFun(x, n= 2, fun = mean, circular = TRUE)

输入数据:

x <- c(0,2.426551575,
       5.890842799,
       0.530641823,
       4.794960386,
       1.271620156,
       5.789548201,
       1.053579352,
       0.095112206,
       6.108843722,
       1.240271853,
       5.350922943)

<强>输出

> movingFun(x, n= 2, fun = mean, circular = T)
 [1] 2.6754615 1.2132758 4.1586972 3.2107423
 [5] 2.6628011 3.0332903 3.5305842 3.4215638
 [9] 0.5743458 3.1019780 3.6745578 3.2955974