具有多个因素分组的数据框的回归
Regression of a Data Frame with multiple factor groupings
我正在编写回归脚本。
我有一个 data.frame 大约有 130 列,我需要针对所有其他 ~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"))
}
}
}
}
}
}
您可以通过组合 dplyr, tidyr and my 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
数据框将为列、配方、步骤、阶段和产品的每种组合各占一行,以及包含每个模型的 R 平方的 r.squared
列. (它还将包含 adj.r.squared
,以及其他列,例如 F 检验 p 值:有关更多信息,请参见 here)。 运行 coefs <- regressions %>% tidy(mod)
也可能对您有用,因为它将从每个回归中获取系数估计值和 p 值。
"broom and dplyr" vignette, and in Section 3.1 of the broom manuscript 中描述了一个类似的用例。
我正在编写回归脚本。 我有一个 data.frame 大约有 130 列,我需要针对所有其他 ~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"))
}
}
}
}
}
}
您可以通过组合 dplyr, tidyr and my 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
数据框将为列、配方、步骤、阶段和产品的每种组合各占一行,以及包含每个模型的 R 平方的 r.squared
列. (它还将包含 adj.r.squared
,以及其他列,例如 F 检验 p 值:有关更多信息,请参见 here)。 运行 coefs <- regressions %>% tidy(mod)
也可能对您有用,因为它将从每个回归中获取系数估计值和 p 值。
"broom and dplyr" vignette, and in Section 3.1 of the broom manuscript 中描述了一个类似的用例。