我有一个数据框DF
,如下所示:
ID Area time
1 1 182.685 1
2 2 182.714 1
3 3 182.275 1
4 4 211.928 1
5 5 218.804 1
6 6 183.445 1
...
1 1 184.334 2
2 2 196.765 2
3 3 186.435 2
4 4 213.322 2
5 5 214.766 2
6 6 172.667 2
..等等ID = 6
。我想对每个ID应用自相关函数,即在时间1将ID = 1
与在时间2的ID = 1
进行比较,依此类推。
申请最直接的方式是什么? acf()
到我的数据框架?
当我尝试使用
时autocorr = aggregate(x = DF$Area, by = list(DF$ID), FUN = acf)
我得到一个奇怪的物体。
提前致谢!
答案 0 :(得分:2)
我想在每个ID上应用自相关函数
好的,好的,所以你不需要任何互相关,这会让事情变得更容易。
我得到一个奇怪的对象
acf
返回一堆内容,即返回一个列表。我想你只会对ACF值感兴趣,所以你需要:
FUN = function (u) c(acf(u, plot = FALSE)$acf)
另外,使用aggregate
并不是一个好主意。您可能需要split
和sapply
:
## so your data frame is called `x`
oo <- sapply(split(x$Area, x$ID), FUN = function (u) c(acf(u, plot = FALSE)$acf) )
如果您有平衡数据,即如果每个ID
的观察数相同,oo
将被简化为矩阵。如果您没有平衡数据,则可能需要显式控制lag.max
中的acf
参数。默认情况下,acf
会根据观察次数自动决定此值。
现在假设我们希望滞后0到滞后7,我们可以设置:
oo <- sapply(split(x$Area, x$ID),
FUN = function (u) c(acf(u, plot = FALSE, lag.max = 7)$acf) )
因此结果oo
是一个8行的矩阵(滞后行,ID
列)。我没有看到使用数据帧来保存此结果的任何好处,但如果您想要数据框,只需执行以下操作:
data.frame(oo)
对于矩阵或数据框中的数据,您可以轻松进行进一步分析。
有关acf
的完整说明,请阅读Produce a boxplot for multiple ACFs