我有一个类似于以下内容的数据框,共有 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
计算回归系数的函数。最后rollapply
在z
.请注意,返回对象的索引给出了 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/