R:使用 rollapply 和 ddply 分组滚动 window 线性回归
R: Grouped rolling window linear regression with rollapply and ddply
我有一个包含多个分组变量的数据集,我想对其进行 运行 滚动 window 线性回归。最终目标是提取具有最低斜率的 10 个线性回归并将它们平均在一起以提供平均最小变化率。我找到了使用 rollapply 计算滚动 window 线性回归的示例,但我有一个额外的复杂性,我想将这些线性回归应用于数据集中的组。
这是一个示例数据集和我当前的代码,该代码很接近但不能正常工作。
dat<-data.frame(w=c(rep(1,27), rep(2,27),rep(3,27)), z=c(rep(c(1,2,3),27)),
x=c(rep(seq(1,27),3)), y=c(rnorm(27,10,3), rnorm(27,3,2.2), rnorm(27, 6,1.3)))
其中 w 和 z 是两个分组变量,x 和 y 是回归项。
从我的互联网搜索中,这里是一个 R 基本滚动 window 线性回归代码,其中 window 大小为 6,顺序回归由 3 个数据点分隔,我只提取斜率系数(我...)[2]
library(zoo)
slopeData<-rollapply(zoo(dat), width=6, function(Z) {
coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
}, by = 3, by.column=FALSE, align="right")
现在我希望将此滚动 window 回归应用于由两个分组变量 w 和 z 指定的组。所以我使用 plyr 包中的 ddply 尝试了类似的东西。首先我尝试将上面的代码重写为一个函数。
rolled<-function(df) {
rollapply(zoo(df), width=6, function(Z) {
coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
}, by = 3, by.column=FALSE, align="right")
}
然后 运行 使用 ddply
应用该函数
groupedSlope <- ddply(dat, .(w,z), function(d) rolled(d))
但是,这不起作用,因为我收到了一系列警告和错误。我想有些错误可能与动物园格式和数据框的组合有关,这变得过于复杂。到目前为止我一直在努力,但是
有谁知道分组、滚动 window 线性回归的方法,可能比这种方法更简单?
感谢您的帮助,
内特
1) rollapply
也适用于数据帧,因此没有必要将 df
转换为动物园。
2) lm
使用 na.action
,而不是 na.rm
,它的默认值是 na.omit
所以我们可以放弃这个参数。
3) rollapplyr
更简洁的写法是rollapply(..., align = "right")
.
假设 rolled
以其他方式执行您想要的并将这些更改合并到 rolled
中,问题中的 ddply
语句应该有效,或者我们可以使用 by
来自我们在下面显示的 R 的基数:
rolled <- function(df) {
rollapplyr(df, width = 6, function(m) {
coef(lm(formula = y ~ x, data = as.data.frame(m)))[2]
}, by = 3, by.column = FALSE
)
}
do.call("rbind", by(dat, dat[c("w", "z")], rolled))
我有一个包含多个分组变量的数据集,我想对其进行 运行 滚动 window 线性回归。最终目标是提取具有最低斜率的 10 个线性回归并将它们平均在一起以提供平均最小变化率。我找到了使用 rollapply 计算滚动 window 线性回归的示例,但我有一个额外的复杂性,我想将这些线性回归应用于数据集中的组。
这是一个示例数据集和我当前的代码,该代码很接近但不能正常工作。
dat<-data.frame(w=c(rep(1,27), rep(2,27),rep(3,27)), z=c(rep(c(1,2,3),27)),
x=c(rep(seq(1,27),3)), y=c(rnorm(27,10,3), rnorm(27,3,2.2), rnorm(27, 6,1.3)))
其中 w 和 z 是两个分组变量,x 和 y 是回归项。
从我的互联网搜索中,这里是一个 R 基本滚动 window 线性回归代码,其中 window 大小为 6,顺序回归由 3 个数据点分隔,我只提取斜率系数(我...)[2]
library(zoo)
slopeData<-rollapply(zoo(dat), width=6, function(Z) {
coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
}, by = 3, by.column=FALSE, align="right")
现在我希望将此滚动 window 回归应用于由两个分组变量 w 和 z 指定的组。所以我使用 plyr 包中的 ddply 尝试了类似的东西。首先我尝试将上面的代码重写为一个函数。
rolled<-function(df) {
rollapply(zoo(df), width=6, function(Z) {
coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
}, by = 3, by.column=FALSE, align="right")
}
然后 运行 使用 ddply
应用该函数groupedSlope <- ddply(dat, .(w,z), function(d) rolled(d))
但是,这不起作用,因为我收到了一系列警告和错误。我想有些错误可能与动物园格式和数据框的组合有关,这变得过于复杂。到目前为止我一直在努力,但是 有谁知道分组、滚动 window 线性回归的方法,可能比这种方法更简单?
感谢您的帮助, 内特
1) rollapply
也适用于数据帧,因此没有必要将 df
转换为动物园。
2) lm
使用 na.action
,而不是 na.rm
,它的默认值是 na.omit
所以我们可以放弃这个参数。
3) rollapplyr
更简洁的写法是rollapply(..., align = "right")
.
假设 rolled
以其他方式执行您想要的并将这些更改合并到 rolled
中,问题中的 ddply
语句应该有效,或者我们可以使用 by
来自我们在下面显示的 R 的基数:
rolled <- function(df) {
rollapplyr(df, width = 6, function(m) {
coef(lm(formula = y ~ x, data = as.data.frame(m)))[2]
}, by = 3, by.column = FALSE
)
}
do.call("rbind", by(dat, dat[c("w", "z")], rolled))