我正在制作一个回归脚本。 我有一个大约有130列的data.frame,其中我需要针对所有其他~100个数字列对一列进行回归(让我们称之为X列)。
在计算回归之前,我需要按4个因素对数据进行分组:myDat$Recipe
,myDat$Step
,myDat$Stage
和myDat$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"))
}
}
}
}
}
}
答案 0 :(得分:0)
您可以通过合并dplyr,tidyr和我的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" vignette和the broom manuscript的第3.1节中描述了类似的用例。