【问题标题】:linear regression analysis on subset of data through a loop通过循环对数据子集进行线性回归分析
【发布时间】:2013-11-06 09:59:32
【问题描述】:

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

【问题讨论】:

    标签: r regression linear-regression


    【解决方案1】:

    基于@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))
    

    应该为你提取它们。

    【讨论】:

    • 如果您使用by,它将为您完成拆分工作:by(var,rep(1:10,each=10),lm,formula=y~.) 或使用您的cutvar by(var,cutvar,lm,formula=y~.)
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      您需要对 yx 变量进行子集化。一种简单的方法是直接对var data.frame 进行子集化:

      model_var<-list()
      for (i in 1:10 ) 
        model_var[[i]] = lm(y~.,var[(100*(i-1)+1:100*i,]) 
      

      【讨论】:

      • 我遇到错误 "object 'model_var' not found" 。如何将 lm 模型存储在数组对象中?
      • model_var &lt;- list(); for (i in 1:10) { model_var[[i]] = ... }(这是一个列表,这可能是存储 lm 模型的最佳方式。“数组对象”到底是什么意思?
      • 在我最初的问题中,我将 model_var[i] 称为数组对象,因为我会将我的 LM 模型存储在其中……这就是我所说的“数组对象”。我正在使用数组对象,因为这使我能够使用 for 循环
      猜你喜欢
      • 2020-07-12
      • 2019-09-11
      • 2016-12-03
      • 1970-01-01
      • 2016-01-17
      • 2015-07-11
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多