通过循环对数据子集进行线性回归分析

时间:2013-10-27 17:30:05

标签: r regression linear

我有一个包含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不允许将线性模型拟合到数据的子集。

3 个答案:

答案 0 :(得分:2)

您需要对yx变量进行子集化。一种简单的方法是直接对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