在R中使用线性回归创建新函数:

时间:2016-07-04 01:17:54

标签: r regression linear-regression lm

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

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

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

中的数据来调用它
regresionLineal(Estatura, Largo, Ancho, DATOS)
  

eval(expr,envir,enclos)中的错误:object&#39; Estatura&#39;未找到   来自:eval(expr,envir,enclos)

欢迎任何帮助......

4 个答案:

答案 0 :(得分:2)

你应该这样做:

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()而无需定义自己的功能。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果要创建具有任意数量的自变量的模型,则可以使用以下代码:

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 :(得分:0)

只是想我会为任何未来的读者添加此内容。

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

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

谢谢!