【问题标题】:Creating new Functions with Linear Regression in R :在 R 中创建具有线性回归的新函数:
【发布时间】:2016-11-05 15:47:40
【问题描述】:

创建调用lm() 函数的函数时遇到问题:

regresionLineal <- function (vardep, varindep1, varindep2, DATA) {
  lm(vardep ~ varindep1 + varindep2, data = DATA)
  }

然后我使用我之前创建的数据框 (DATOS) 中的数据来调用它...

regresionLineal(Estatura, Largo, Ancho, DATOS)

eval 中的错误(expr、envir、enclos):找不到对象“Estatura” 调用自:eval(expr, envir, enclos)

欢迎任何帮助...

【问题讨论】:

  • 由于公式接口使用不带引号的名称,因此您需要按原样传递它们,坦率地说,这很复杂。 (现在 R 认为您正在尝试传递 [column] 名称所引用的对象,这些对象实际上并不存在于 data.frame 之外。)将整个公式作为参数传递实际上更容易。

标签: r regression linear-regression lm


【解决方案1】:

只是想我会为任何未来的读者添加这个。

我想出的解决方案(并不完美)是以下函数:

f <- function(y, x1, x2, df) {
  cmd = paste0("lm(", y, " ~ ", x1, " + ", x2, ", data = ",  deparse1(substitute(df)), ")")
  eval(parse(text = cmd))
}

通过这样做,您可以调用,例如,

R> f("mpg", "hp", "wt", mtcars)
Call:
lm(formula = mpg ~ hp + wt, data = mtcars)
Coefficients:
(Intercept)           hp           wt  
    37.2273      -0.0318      -3.8778

与其他方法相比的主要优点是lm 的输出不会混淆变量或数据框的名称。

也许未来的读者会意识到,运行此命令需要了解 R 基本函数:parsedeparse1substituteeval

谢谢!

【讨论】:

    【解决方案2】:

    如果你想创建一个具有任意数量自变量的模型,你可以使用下面的:

    create_lm <- function(data, dep, covs) {
    # Create the first part of the formula with the dependent variable
      form_base <- paste(dep, "~")
    # Create a string that concatenates your covs vector with a "+" between each variable
      form_vars <- paste(covs, collapse = " + ")
    # Paste the two parts together
      formula <- paste(form_base, form_vars)
    # Call the lm function on your formula
      lm(formula, data = data)
    }
    

    例如,使用内置的 mtcars 数据集:

    create_lm(mtcars, "mpg", c("wt", "cyl"))
    
    Call:
    lm(formula = formula, data = data)
    
    Coefficients:
    (Intercept)           wt          cyl  
         39.686       -3.191       -1.508  
    

    缺点是模型的打印输出没有反映您对 lm 的特定调用,不确定是否有任何解决方法。

    【讨论】:

    • 有,请看我的回答。
    【解决方案3】:

    另外,您可能已经知道这一点,但请记住,此处创建的回归对象不会存在于函数之外,除非分配给全局环境或您正在工作的任何环境。如果你需要打电话给reg。稍后出于某种原因将此函数之外的对象分配为:model1 &lt;&lt;- lm(paste(vardep, "~", varindep1, "+", varindep2), data = DATA) 以便能够从全局环境中调用。

    【讨论】:

      【解决方案4】:

      你应该这样做:

      regresionLineal <- function (vardep, varindep1, varindep2, DATA) {
        lm(paste(vardep, "~", varindep1, "+", varindep2), data = DATA)
        }
      

      您将vardepvarindep1varindep2 作为字符串传入。例如,我使用 R 的内置 trees 数据集:

      regresionLineal("Height", "Girth", "Volumn", trees)
      # Call:
      # lm(formula = paste(vardep, "~", varindep1, "+", varindep2), data = DATA)
      
      # Coefficients:
      # (Intercept)        Girth       Volume  
      #     83.2958      -1.8615       0.5756  
      

      但是,我不明白我们为什么要这样做。如果我们必须在公式中指定每个变量,为什么不简单地传入一个完整的公式呢?在这种情况下,您可以直接使用lm(),而无需定义自己的函数。

      【讨论】:

      • 非常感谢,好吧,我不得不说我还必须在我的公式上调用其他函数,这就是我这样做的原因。无论如何,“lm”是最难的。
      • 超级简单!谢谢!
      猜你喜欢
      • 2020-06-28
      • 2018-08-07
      • 2022-01-11
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2020-05-19
      相关资源
      最近更新 更多