使用多个因子分组回归数据框

时间:2015-06-03 14:38:29

标签: r sorting statistics dataframe regression

我正在制作一个回归脚本。 我有一个大约有130列的data.frame,其中我需要针对所有其他~100个数字列对一列进行回归(让我们称之为X列)。

在计算回归之前,我需要按4个因素对数据进行分组:myDat$RecipemyDat$StepmyDat$StagemyDat$Prod,同时保持另一个~100为回归附加的列和行数据。然后我需要对每列~X列进行回归,并用列名打印出R ^ 2值。这是我迄今为止所尝试过的,但它变得过于复杂,我知道必须有更好的方法。

 rm(list=ls())
 myDat <- read.csv(file="C:/Users/Documents/myDat.csv",              header=TRUE, sep=",")

for(j in myDat$Recipe)
{
  myDatj <- subset(myDat, myDat$Recipe == j) 
  for(k in myDatj$Step)
  {
    myDatk <- subset(myDatj, myDatj$Step == k) 
    for(i in myDatk$Stage)
    {
      myDati <- subset(myDatk, myDatk$Stage == i)
      for(m in myDati$Prod)
      {
        myDatm <- subset(myDati, myDati$Prod == m)
          if(is.numeric(myDatm[3,i]))  
          {     
          fit <- lm(myDatk[,i] ~ X, data=myDatm) 
          rsq <- summary(fit)$r.squared
            {
              writeLines(paste(rsq,i,"\n"))
           }  
         }
      }
    }
  }  
}      

1 个答案:

答案 0 :(得分:0)

您可以通过合并dplyrtidyr和我的broom包(您可以使用install.packages安装它们)来完成此操作。首先,您需要将所有数字列收集到一个列中:

library(dplyr)
library(tidyr)
tidied <- myDat %>%
    gather(column, value, -X, -Recipe, -Step, -Stage, -Prod)

要了解这一点,您可以阅读tidyr's gather operation。 (这假设除了X,Recipe,Step,Stage和Prod之外的所有列都是数字的,因此应该在回归中进行预测。如果不是这种情况,则需要事先将其删除。您将会这样做。如果您需要更加个性化的解决方案,需要制作一个可重现的问题示例。)

然后执行每个回归,同时按列和四个分组变量进行分组。

library(broom)

regressions <- tidied %>%
    group_by(column, Recipe, Step, Stage, Prod) %>%
    do(mod = lm(value ~ X))

glances <- regressions %>% glance(mod)

生成的glances数据框对于列,Recipe,Step,Stage和Prod的每个组合都有一行,以及包含每个模型的R平方的r.squared列。 (它还包含adj.r.squared以及其他列,例如F-test p值:有关详情,请参阅here。运行coefs <- regressions %>% tidy(mod)也可能对您有用,因为它将获得每次回归的系数估计值和p值。

"broom and dplyr" vignettethe broom manuscript的第3.1节中描述了类似的用例。