简体   繁体   English

使用来自另一个变量的名称在 r 中迭代和循环 glm 中的多个列

[英]Iterating and looping over multiple columns in glm in r using a name from another variable

I am trying to iterate over multiple columns for a glm function in R.我正在尝试为 R 中的 glm 函数迭代多个列。

view(mtcars)
names <- names(mtcars[-c(1,2)])

for(i in 1:length(names)){
  
  print(paste0("Starting iterations for ",names[i]))
  
  
  model <-  glm(mpg ~ cyl + paste0(names[i]), data=mtcars, family = gaussian())
  summary(model)
  
  print(paste0("Iterations for ",names[i], " finished"))
}

however, I am getting the following error:但是,我收到以下错误:

[1] "Starting iterations for disp"
Error in model.frame.default(formula = mpg ~ cyl + paste0(names[i]), data = mtcars,  : 
  variable lengths differ (found for 'paste0(names[i])')

Not sure, how I can correct this.不确定,我该如何纠正。

mpg ~ cyl + paste0(names[i]) or even mpg ~ cyl + names[i] is not a valid syntax for a formula. mpg ~ cyl + paste0(names[i])甚至mpg ~ cyl + names[i]不是公式的有效语法。 Use利用

reformulate(c("cyl", names[i]), "mpg")

instead, which dynamically creates a formula from variable names.相反,它从变量名称动态创建公式。

Since you need to build your model formula dynamically from string you need as.formula .由于您需要从字符串动态构建模型公式,因此您需要as.formula Alternatively, consider reformulate which receives response and RHS variable names:或者,考虑reformulate接收响应和 RHS 变量名称:

...
    fml <- reformulate(c("cyl", names[i]), "mpg")
    model <-  glm(fml, data=mtcars, family = gaussian())
    summary(model)
...

glm takes a formula which you can create using as.formula() glm 采用您可以使用 as.formula() 创建的公式

predictors <- names(mtcars[-c(1,2)])

for(predictor in predictors){
  
  print(paste0("Starting iterations for ",predictor))
  
  model <-  glm(as.formula(paste0("mpg ~ cyl + ",predictor)), 
                           data=mtcars, 
                           family = gaussian())
  print(summary(model))
  
  print(paste0("Iterations for ",predictor, " finished"))
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM