在带有lm->>的R函数中找不到对象'...'(eval(predvars,data,env)错误:未找到对象'...')

时间:2020-06-09 13:21:27

标签: r function dataframe data-analysis lm

我正在使用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 

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

3 个答案:

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

答案 1 :(得分:0)

最酷的方法之一是使用新的食谱包为我们生成公式,然后操纵小标题以产生或产生结果

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-06-09创建

答案 2 :(得分:0)

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

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()