【问题标题】:Linear regression loop and coefficient extraction error线性回归循环和系数提取误差
【发布时间】:2019-04-18 05:35:36
【问题描述】:

我基本上想运行 1000 次线性回归(非常简单,Y~X)并从每个回归中提取系数。每个回归都在 Y 的 200 个观测值的“块”中,因为每个回归的 X 保持不变。这就是我所拥有的:

X<-rgamma(200,23,2)

U_list <- replicate(1000,rnorm(200,0,1),simplify = FALSE)
U_list <- setNames(U_list,paste0("U",seq_along(U_list)))

U<-unlist(U_list)

Y_list<-0.6+0.4*X+U
Y_list<-setNames(Y_list,paste0("Y",seq_along(Y_list)))

Y<-unlist(Y_list)

为了尝试这个,我尝试了一个 for 循环

k<-seq(from=1, to=200000, by=200)
for(i in k){
  assign(paste0("reg", i), lm(Y[i:199+i]~X))
}

我想通过这个循环我会做这样的事情

reg1<-lm(Y[1:200]~X)
reg2<-lm(Y[201:400]~X) etc.

但是出现了下面的错误,我也不是很明白,因为如果我一个一个地做回归,就会得到一个结果

Error in model.frame.default(formula = Y[i:199 + i] ~ X, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'X')

对于系数提取,我想到了一些 rbind(),但我不太确定这是否会产生结果。如果问的不多,我将不胜感激,因为我仍在学习如何编程,有时会令人沮丧!

【问题讨论】:

    标签: r error-handling linear-regression coefficients


    【解决方案1】:

    我会用另一种数据结构解决您的问题,这样可以更轻松地将函数应用于多个元素 - data.frame:

    X<-rgamma(200,23,2)
    
    Y <- replicate(1000,rnorm(200,0,1),simplify = T)
    
    Mat <- as.data.frame(cbind(X,Y))
    
    names(Mat) <- c("X",paste("Y",1:1000,sep="_"))
    
    Coeffs <- as.data.frame(t(apply(Mat[,2:ncol(Mat)],2,function(col){
      mod <- lm(col ~ Mat[,"X"])
      return(mod$coefficients)
    })))
    
    head(Coeffs,10)
    
         (Intercept)   Mat[, "X"]
    Y_1    0.1616418 -0.007862732
    Y_2    0.3841935 -0.030134746
    Y_3   -0.4244851  0.044787500
    Y_4    0.2059972 -0.017895949
    Y_5    0.5207483 -0.048730507
    Y_6    0.5163610 -0.036493825
    Y_7    0.3589379 -0.038667216
    Y_8   -0.2291387  0.025178289
    Y_9   -0.1274423  0.010477415
    Y_10  -0.6508141  0.047532979
    

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 2016-01-17
      • 2013-10-14
      • 2016-05-21
      相关资源
      最近更新 更多