R,线性回归的自动循环,在不同的DV上使用相同的IV来存储系数

时间:2017-08-16 17:30:27

标签: r automation regression

Mtcars对11个变量进行了32次观测。假设“mpg”,“drat”,“qsec”是感兴趣的因变量。假设“cyl”和“hp”是模型类型1的独立变量,“disp”是模型类型2的独立变量。我想自动化一些回归但不能执行下面的步骤(2)。

我想做什么?

在我的实际数据框架中,我有许多感兴趣的因变量而不是自变量。

  1. 我想为以下各项运行“lm”或“glm”:

    • mpg~cyl + hp,
    • DRAT〜缸+马力,
    • 的QseC〜缸+马力,
    • mpg~disp,
    • drat~dismp,
    • 的QseC〜DISP
  2. 这似乎是我目前最大的问题。我想制作一个新的数据框(估算值),它包含系数Estimate和Pr(> | t |),例如(假设已填写),

    IV DV mpg.Est mpg.Pr drat.Est drat.Pr qsec.Est qsec.Pr cyl -2.26 0.00 .. .. .. .. hp -0.02 0.21 .. .. .. .. disp -0.04 0.00 .. .. .. ..

  3. 然后我想将列附加到描述每个IV(cyl,hp,disp)的Pr值的“估计值”,例如: (假设已填写),

    IV stat mean.Pr median.Pr min.Pr max.Pr cyl 0.03 0.02 0.00 0.18 hp .. .. .. .. disp .. .. .. ..

  4. 尝试

    ##### Step (1)
    ## Make the formulae
    ##   For scale, it would be great to use varlists here:
    ##     dvvarlist <- c("mpg", "drat", "qsec")
    ##     ivvarlist <- c("cyl + hp", "disp")
    models <- lapply(paste(c("mpg", "mpg", "drat", "drat", "qsec", "qsec"),
        c("cyl + hp", "disp"), sep = "~"), formula)
    
    ## Run the regressions
    res.models <- lapply(models, FUN = function(x) 
        {summary(lm(formula = x, data = mtcars))})
    
    ##### Step (2)
    ## Spot the coefficients
    coefficients(res.models[[1]])
    
    ## How to automate grab coefficients from all models?
    
    ## How to automate place coefficients in proper location in new dataframe?
    
    ##### Step (3)
    ## Append columns to "estimates"
    ##   For scale, could again use dvvarlist <- c("mpg", "drat", "qsec")
    estimates$mean.Pr <- rowMeans(estimates[ , c("mpg.Est", "drat.Est", "qsec.Est")])
    

    相关链接?

1 个答案:

答案 0 :(得分:2)

使用基数R:

 data("mtcars")
 y=c("mpg","drat","qsec")
 x=c("cyl+hp","disp")

 A=Map(function(i,j)
   summary(lm(as.formula(paste0(i,"~",j)),data=mtcars))$coef[,c(1,4)],
   rep(y,each=length(x)),x)   

 B=do.call(cbind.data.frame,
      tapply(A,rep(y,each=length(x)),
       function(s){a=do.call(rbind,s);a[row.names(a)!="(Intercept)",]}))
 B
        drat.Estimate drat.Pr(>|t|) mpg.Estimate mpg.Pr(>|t|) qsec.Estimate qsec.Pr(>|t|)
   cyl   -0.318242238  5.528430e-05  -2.26469360 4.803752e-04  -0.005485698   0.981671077
   hp     0.003401029  6.262861e-02  -0.01912170 2.125285e-01  -0.018339365   0.005865329
   disp  -0.003063904  5.282022e-06  -0.04121512 9.380327e-10  -0.006253039   0.013144036

我还不清楚第三步需要什么。我希望你能进一步阐述。虽然我看了你的代码,看起来你正在寻找系数的平均值,系数的中位数等。我不知道你是否也在寻找概率的均值,最大值等,但我只是计算它们以备不时之需:

  C=split(data.frame(t(B)),rep(c("Estimate","Pr(>|t|)"),length(y)))

  D=lapply(C,function(f)
         matrix(mapply(function(i,j) i(j),
                          rep(c(mean,median,min,max),each=length(f)),f),length(f)))

   cbind(B,do.call(cbind.data.frame,lapply(D,`colnames<-`,c("mean","median","min","max"))))


     drat.Estimate drat.Pr(>|t|) mpg.Estimate mpg.Pr(>|t|) qsec.Estimate qsec.Pr(>|t|) Estimate.mean
cyl   -0.318242238  5.528430e-05  -2.26469360 4.803752e-04  -0.005485698   0.981671077   -0.86280718
hp     0.003401029  6.262861e-02  -0.01912170 2.125285e-01  -0.018339365   0.005865329   -0.01135334
disp  -0.003063904  5.282022e-06  -0.04121512 9.380327e-10  -0.006253039   0.013144036   -0.01684402
       Estimate.median Estimate.min Estimate.max Pr(>|t|).mean Pr(>|t|).median Pr(>|t|).min Pr(>|t|).max
  cyl     -0.318242238  -2.26469360 -0.005485698   0.327402245    4.803752e-04 5.528430e-05   0.98167108
  hp      -0.018339365  -0.01912170  0.003401029   0.093674136    6.262861e-02 5.865329e-03   0.21252847
  disp    -0.006253039  -0.04121512 -0.003063904   0.004383106    5.282022e-06 9.380327e-10   0.01314404

我相信您可以将其转置为在一个屏幕中查看,而不是向左/向右滚动。  如果这有助于告诉我们。谢谢