【问题标题】:object '...' not found in R Functions with lm -->> (Error in eval(predvars, data, env) : object '...' not found)在带有 lm -->> 的 R 函数中找不到对象“...”(eval 中的错误(predvars,data,env):找不到对象“...”)
【发布时间】:2020-09-28 16:36:42
【问题描述】:

我正在使用moderndrive 包来计算线性回归,但使用了一个函数。我正在尝试创建一个函数,我可以只从我的数据框(Rona_2020)中传入两个选定的列(例如死亡和病例、列的标题)。下面是函数...

score_model_Fxn <- function(y, x){
  score_mod <- lm(y ~ x, data = Rona_2020)
  Reg_Table <- get_regression_table(score_mod)
print(paste('The regression table is', Reg_Table))
}

当我运行函数时...

score_model_Fxn(deaths, cases)

我明白了……

Error in eval(predvars, data, env) : object 'deaths' not found 

我该怎么办?我看过几个类似的问题,但无济于事。

【问题讨论】:

  • 您正在使用范围之外的准引用
  • score_model_Fxn("deaths", "cases") 并在您的函数中:lm(paste0(y, "~", x), data=Rona_2020)

标签: r function dataframe data-analysis lm


【解决方案1】:

通过deathscases 想要做的事情称为非标准评估。如果要运行具有正确公式和范围的模型,则需要将其与语言计算结合起来。可以使用substitutebquote 对语言进行计算。

library(moderndive)
score_model_Fxn <- function(y, x, data){

  #get the symbols passed as arguments:
  data <- substitute(data)
  y <- substitute(y)
  x <- substitute(x)

  #substitute them into the lm call and evaluate the call:
  score_mod <- eval(bquote(lm(.(y) ~ .(x), data = .(data))))

  Reg_Table <- get_regression_table(score_mod)

  message('The regression table is') #better than your paste solution
  print(Reg_Table)

  invisible(score_mod) #a function should always return something useful
}

mod <- score_model_Fxn(Sepal.Length, Sepal.Width, iris)
#The regression table is
## A tibble: 2 x 7
#  term        estimate std_error statistic p_value lower_ci upper_ci
#  <chr>          <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
#1 intercept      6.53      0.479     13.6    0         5.58    7.47 
#2 Sepal.Width   -0.223     0.155     -1.44   0.152    -0.53    0.083

print(mod)
#
#Call:
#lm(formula = Sepal.Length ~ Sepal.Width, data = iris)
#
#Coefficients:
#(Intercept)  Sepal.Width  
#     6.5262      -0.2234  

如果您愿意,也可以让函数返回 Reg_Table

【讨论】:

  • 非常感谢!有效。我不知道消息部分。所以我又学到了新东西!
【解决方案2】:

这样做最酷的方法之一是使用新的食谱包为我们生成公式,然后操作小标题来生成或结果

library(tidyverse)
library(recipes)
#> 
#> Attaching package: 'recipes'
#> The following object is masked from 'package:stringr':
#> 
#>     fixed
#> The following object is masked from 'package:stats':
#> 
#>     step
library(moderndive)

score_model_Fxn <- function(df,x, y){
  formula_1 <- df %>% 
    recipe() %>%
    update_role({{x}},new_role = "outcome") %>% 
    update_role({{y}},new_role = "predictor") %>% 
    formula()

  Reg_Table <- mtcars %>%
    summarise(score_mod = list(lm(formula_1,data = .))) %>%
    rowwise() %>% 
    mutate(Reg_Table = list(get_regression_table(score_mod))) %>% 
    pull(Reg_Table)

  print(paste('The regression table is', Reg_Table))
  Reg_Table
}

k <- mtcars %>%
  score_model_Fxn(x = cyl,y = gear)
#> [1] "The regression table is list(term = c(\"intercept\", \"gear\"), estimate = c(10.585, -1.193), std_error = c(1.445, 0.385), statistic = c(7.324, -3.101), p_value = c(0, 0.004), lower_ci = c(7.633, -1.978), upper_ci = c(13.537, -0.407))"

k
#> [[1]]
#> # A tibble: 2 x 7
#>   term      estimate std_error statistic p_value lower_ci upper_ci
#>   <chr>        <dbl>     <dbl>     <dbl>   <dbl>    <dbl>    <dbl>
#> 1 intercept    10.6      1.44       7.32   0         7.63   13.5  
#> 2 gear         -1.19     0.385     -3.10   0.004    -1.98   -0.407

reprex package (v0.3.0) 于 2020 年 6 月 9 日创建

【讨论】:

  • 感谢您的反馈!一个问题,在 Reg_table 的创建中......你的意思是 df 而不是函数中的 mtcars 吗?
  • 我的计算机上没有安装 df,这就是为什么我要求 reprex,根据您的要求更换 mtcars
  • 你的功能没问题。但我做了一些改变......我将结果更改为 y,将预测变量更改为 x。至于 mtcars 的位置,我只是用 df 替换了它。这些更改在不使用函数的情况下给了我正确的答案,包括与 Roland 的类似答案。至于印刷膏,我意识到它只是多余的。只允许打印(Reg_table)。感谢您的反馈和努力。
【解决方案3】:

对于那些可能感兴趣的人......我修改了布鲁诺的答案。

library(tidyverse); library(recipes); library(moderndive)

score_model_Fxn2 <- function(df,x, y){
  formula_1 <- df %>% 
    recipe() %>%
    update_role({{y}},new_role = "outcome") %>% 
    update_role({{x}},new_role = "predictor") %>% 
    formula()
  Reg_Table <- df %>%
    summarise(score_mod = list(lm(formula_1,data = .))) %>%
    rowwise() %>%  
     mutate(Reg_Table = list(get_regression_table(score_mod))) %>% 
    pull(Reg_Table)
  print(Reg_Table)
}
score_model_Fxn2()

【讨论】:

  • 我的意思是你甚至没有改变参数,这实际上是我的回答,没有代表......
  • 是的...这就是你被认可的原因。 :)
  • 好吧,我猜你似乎没有太多这样的问题,因为你的观点,这很好,顺便说一句,我什至忘了欢迎你来到 SO,基本上我们不一定回答您的问题正是针对您的数据,当您不提供所述数据时更是如此,所以我的回答基本上就是您的回答,但您并没有通过 SO 中实施的积分系统来承认它,这给了我回答问题的动力,tldr我不太愿意回答您或其他初学者提出的下一个问题
  • 你是对的。我是新来的。如果我做错了什么,请原谅我。
猜你喜欢
  • 2018-11-05
  • 2020-09-21
  • 2020-04-12
  • 1970-01-01
  • 2022-01-11
  • 2020-04-02
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多