【问题标题】:Looping ggplot2 multiple linear regression循环ggplot2多元线性回归
【发布时间】:2020-12-28 18:10:38
【问题描述】:

我正在尝试循环我的多元线性回归图和摘要,但我一直在 R 中遇到错误,指出 Error: More than one expression parsed。我不确定如何解决这个问题,或者是否有更好的方法来实现我想要做的主要是:

  1. 绘制以Group为颜色的多元线性回归图
  2. 获取基于Group 的每条线性回归线的摘要
  3. 计算回归摘要
  4. 执行方差分析以确定差异
colNames <- names(df)[c(35:39)]
for(i in colNames){
  plt <- ggplot(df, 
aes_string(x=df$MachineLength, y=i, fill=df$Group, color=be_nlyl$Group)) + 
geom_smooth(method=lm) + 
geom_point(size = 2, alpha=0.7) + 
labs(title="Machine", subtitle = "Machine Type") + 
theme_bw() + 
theme(plot.title = element_text(hjust=0.5, face="bold"), 
plot.subtitle = element_text(hjust=0.5))
  print(plt)
  lm_A <- lm(formula = i ~ MachineLength, data = subset(be_nlyl, Group == "A"))
  summary(lm_A) %>% print()
lm_B <- lm(formula = i ~ MachineLength, data = subset(be_nlyl, Group == "B"))
  summary(lm_B) %>% print()
  clz.lm <- lm(formula = i ~ Group + MachineLength + Group:MachineLength, data = df)
summary(clz.lm) %>% print()
  ano.lm <- Anova(lm(i ~ MachineLength*Group, data = df))
  print(ano.lm)
}

有人对如何实现上述有想法吗?谢谢!

【问题讨论】:

  • j &lt;- as.symbol(i); lm_A &lt;- eval(bquote(lm(formula = .(j) ~ MachineLength, data = subset(df, Group == "A"))))
  • 您的 ggplot2 aes 代码也可能不正确。从中删除df$ 并引用除i 之外的所有变量。

标签: r loops for-loop ggplot2 regression


【解决方案1】:

尝试以下方法:

  1. 创建长度为colNames 的列表来存储所有输出,这样我们就可以存储它们,而不仅仅是打印输出。

  2. 使用for 循环遍历colNames 的索引而不是实际的列名,以便您可以将其用作索引来存储不同对象的输出。

  3. aes_string 已被弃用,因此我们使用.data 代词将列名作为变量传递。

  4. 使用sprintf 创建公式字符串,并在lm 函数中传递。

library(ggplot2)

colNames <- names(df)[c(35:39)]
plt <- vector('list', length(colNames))
lm_A <- vector('list', length(colNames))
summary_lm_A <- vector('list', length(colNames))
summary_lm_B <- vector('list', length(colNames))
lm_B <- vector('list', length(colNames))
clz.lm <- vector('list', length(colNames))
summary_clz.lm <- vector('list', length(colNames))
ano.lm <- vector('list', length(colNames))

for(i in seq_along(colNames)) {
  var <- colNames[i]
  plt[[i]] <- ggplot(df, aes(MachineLength, .data[[var]], fill= Group, color= Group)) + 
               geom_smooth(method=lm) + 
               geom_point(size = 2, alpha=0.7) + 
               labs(title="Machine", subtitle = "Machine Type") + 
               theme_bw() + 
               theme(plot.title = element_text(hjust=0.5, face="bold"), 
                     plot.subtitle = element_text(hjust=0.5))
  lm_A[[i]] <- lm(sprintf('%s~MachineLength', var), data = subset(df, Group == "A"))
  summary_lm_A[[i]] <- summary(lm_A[[i]])
  lm_B[[i]] <- lm(sprintf('%s~MachineLength', var), data = subset(df, Group == "B"))
  summary_lm_B[[i]] <- summary(lm_B[[i]])
  clz.lm[[i]] <- lm(sprintf('%s~Group + MachineLength + Group:MachineLength', var), data = df)
  summary_clz.lm[[i]] <- summary(clz.lm[[i]])
  ano.lm[[i]] <- Anova(lm(sprintf('%s~MachineLength*Group', var), data = df))
}

【讨论】:

  • 谢谢!!我只需要在最后一行的第三行将printf() 更新为sprintf() 即可消除我最初遇到的错误,之后代码运行完美!如果有办法在打印输出中显示列名而不是 %s~,那就太好了,现在它显示 Call: lm(formula = sprintf("%s~MachineLength", var), data = subset(df, Group == "Case")) 但不确定是否可以显示 Call: lm(formula = sprintf("TypeA~MachineLength", var), data = subset(df, Group == "Case"))
  • 谢谢。我更正了sprintf 错字。改变这个电话并不简单。你必须在那里使用eval + call。看到这个stackoverflow.com/questions/38558523/…
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2017-05-05
  • 2013-07-17
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多