我有一个包含1000行和10列的数据框。第一列是我的y变量,其余列是x变量。我想在10个不同的数据子集上拟合10个不同的线性回归。例如:row1:100第一个子集,row101:200个第二个子集等...我想将每个线性模型的输出(斜率值)存储在新数据集的一行中。是否有捷径可寻?我在下面尝试过:
for (i in 1:10 ) {
model_var[i] = lm(y[(100*(i-1)+1:100*i]~.,var)
# var is my dataframe that has all the data
#model_var[i] will store linear models
}
但我收到了一个错误。似乎R不允许将线性模型拟合到数据的子集。
答案 0 :(得分:2)
您需要对y
和x
变量进行子集化。一种简单的方法是直接对var
data.frame进行子集化:
model_var<-list()
for (i in 1:10 )
model_var[[i]] = lm(y~.,var[(100*(i-1)+1:100*i,])
答案 1 :(得分:2)
基于@nograpes答案的稍微优雅的解决方案:
制作一些数据:
set.seed(101)
var <- data.frame(y=1:1000,matrix(runif(10000),nrow=1000))
创建拆分变量(或者参见ggplot2::cut_number
)
cutvar <- (seq(nrow(var))-1) %/% 100
拆分数据并使用lapply
:
mList <- lapply(split(var,cutvar),lm,formula=y~.)
如果您只想要系数
t(sapply(mList,coef))
应该为你提取它们。
答案 2 :(得分:2)
另一种方法是使用zoo包中的rollapply
。
使用与Ben Bolker略有不同的数据并应用rollapply
即可获得它。
set.seed(1)
var <- data.frame(matrix(runif(10000),nrow=1000))
colnames(var) <- c("y", paste0("x", 1:9))
Coef <- rollapply(var,
width = 100, by=100,
FUN = function(z) {
coef(lm(y~., data=as.data.frame(z)))
},
by.column = FALSE, align = "right")
round(Coef, 3) # and here's the coefficients corresponding to the 10 regressions
(Intercept) x1 x2 x3 x4 x5 x6 x7 x8 x9
[1,] 0.416 -0.253 0.093 -0.047 0.039 0.081 0.053 -0.022 0.084 0.006
[2,] 0.656 0.144 -0.209 -0.150 -0.066 0.084 0.018 -0.114 -0.016 0.073
[3,] 0.311 -0.134 0.006 0.047 0.036 0.020 0.082 0.172 0.211 -0.090
[4,] 0.720 -0.110 0.094 -0.058 -0.018 -0.256 -0.058 0.074 -0.042 0.010
[5,] 0.510 0.052 0.019 -0.193 -0.045 0.114 -0.093 0.044 0.059 0.051
[6,] 1.044 -0.037 -0.300 -0.180 0.148 0.018 -0.187 -0.128 -0.182 -0.154
[7,] 0.558 0.027 -0.231 -0.074 0.065 0.192 -0.022 -0.105 -0.002 0.046
[8,] 0.496 0.156 -0.129 -0.061 0.025 0.028 -0.010 0.097 -0.031 -0.090
[9,] 0.435 0.140 0.138 -0.170 -0.085 -0.069 -0.077 -0.056 0.190 0.105
[10,] 0.282 0.078 0.014 -0.005 0.110 0.149 0.001 0.175 -0.017 -0.033