r - 在多列数据上使用 rollapply 和 lm

标签 r zoo lm rollapply

我有一个类似于以下内容的数据框,共有 500 列:

Probes <- data.frame(Days=seq(0.01, 4.91, 0.01), B1=5:495,B2=-100:390, B3=10:500,B4=-200:290)

我想计算一个滚动窗口线性回归,其中我的窗口大小为 12 个数据点,每个顺序回归由 6 个数据点分隔。对于每个回归,“天数”将始终是模型的 x 分量,而 y 将是其他每一列(B1,然后是 B2、B3 等)。然后,我想将系数保存为具有现有列标题(B1、B2 等)的数据框。

我认为我的代码很接近,但不太有效。我使用了动物园图书馆中的 rollapply。
slopedata<-rollapply(zoo(Probes), width=12, function(Probes) { 
 coef(lm(formula=y~Probes$Days, data = Probes))[2]
 }, by = 6, by.column=TRUE, align="right")

如果可能,我还希望将“xmins”保存到向量中以添加到数据帧中。这意味着每个回归中使用的最小 x 值(基本上它是“天”列中的每 6 个数字。)
谢谢你的帮助。

最佳答案

1) 定义动物园对象 z其数据包含 Probes其索引取自 Probes 的第一列,即 Days .注意到 lm允许 y要成为一个矩阵定义一个 coefs计算回归系数的函数。最后rollapplyz .请注意,返回对象的索引给出了 xmin。

library(zoo)

z <- zoo(Probes, Probes[[1]])

coefs <- function(z) c(unlist(as.data.frame(coef(lm(z[,-1] ~ z[,1])))))
rz <- rollapply(z, 12, by = 6, coefs, by.column = FALSE, align = "left")

给予:
> head(rz)
     B11 B12  B21 B22 B31 B32  B41 B42
0.01   4 100 -101 100   9 100 -201 100
0.07   4 100 -101 100   9 100 -201 100
0.13   4 100 -101 100   9 100 -201 100
0.19   4 100 -101 100   9 100 -201 100
0.25   4 100 -101 100   9 100 -201 100
0.31   4 100 -101 100   9 100 -201 100

请注意 DF <- fortify.zoo(rz)如果您需要 rz 的数据框表示,可以使用.

2) 另一种有点类似的方法是 rollaplly在行号上:
library(zoo)
y <- as.matrix(Probes[-1])
Days <- Probes$Days
n <- nrow(Probes)
coefs <- function(ix) c(unlist(as.data.frame(coef(lm(y ~ Days, subset = ix)))), 
      xmins = Days[ix][1])
r <- rollapply(1:n, 12, by = 6, coefs)

关于r - 在多列数据上使用 rollapply 和 lm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33813627/

相关文章:

r - 在 R 中索引嵌套列表

r - 不可重现的 R 包可用性检查

r - 有没有办法让 geoms 褪色但坚持 gganimate?

r - R 中索引和合并 XTS 对象的问题

R中的滚动回归xts对象

r - 使用 xtable 函数更改从 lm 回归中获得的表的行名称

R:为每个类别建立单独的模型

r - 如何从指定号码(不带名称)中仅提取号码?

R 数据帧 : Inter-row calculations

r - 如何在最接近的日期合并 2 个 Zoo/data.frame 对象?