2013-10-27 26 views
0

我有一个有1000行和10列的数据框。第一列是我的变量,其余列是x变量。我想对10个不同的数据子集进行10种不同的线性回归。例如:行1:100第一个子集,行101: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不允许将线性模型拟合到数据的子集。

回答

2

稍微更优雅的解决方案:

做了一些数据:

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)) 

应提取它们。

+1

如果你使用'by',它会为你做分割工作:'by(var,rep(1:10,each = 10),lm,formula = y〜。)'或者使用你的'cutvar'由(var,cutvar,lm,formula = y〜。)' – nograpes

2

您需要子集yx变量。一个简单的方法来做到这将是子集直接var data.frame:根据@ nograpes的回答

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

我得到错误“object'model_var'not found”。如何将lm模型存储在数组对象中? – user2543622

+0

'model_var < - list();对于(我在1:10){model_var [[i]] = ...}(这是一个列表,这可能是存储lm模型的最佳方式。“数组对象”究竟意味着什么? –

+0

在我原来的问题中,我指的是model_var [i]作为一个数组对象,因为我将在它们中存储我的LM模型...这就是我所说的“数组对象”。使我可以使用for循环 – user2543622

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