【问题标题】:can not use Non-standard evaluation in self-define function in rr中的自定义函数中不能使用非标准评估
【发布时间】:2021-05-08 14:06:50
【问题描述】:

我想编写一个从gam 模型中提取一些信息的函数。 我可以在没有自定义函数的情况下做到这一点(df 是我想要的):

library(mgcv)
library(tidyverse)
model = gam(mpg ~ cyl, data = mtcars)

result = summary(model)$p.table

estimate = result[2,1]
se = result[2,2]

df = data.frame(estimate = estimate, se = se)
df

然后我用自定义函数包裹它:

my_gam <- function(y, x, data){
  
  model = gam(y ~ x, data = data)
  
  result = summary(model)$p.table
  
  estimate = result[2,1]
  se = result[2,2]
  
  df = data.frame(estimate = estimate, se = se)
  df
}

但我无法正确使用我的功能。

my_gam(y = mpg, x = cyl, data = mtcars)

eval 中的错误(predvars、data、env):找不到对象“cyl”

my_gam(y = 'mpg', x = 'cyl', data = mtcars)

gam(y ~ x, data = data) 中的错误: 没有足够的(非 NA)数据来做任何有意义的事情

当我运行my_gam(y = mpg, x = cyl, data = mtcars) 时,我是否可以将df 作为第一个代码块。

任何帮助将不胜感激!

【问题讨论】:

    标签: r dplyr model evaluation


    【解决方案1】:

    我们可以用paste 构造一个公式,这会很快

    my_gam <- function(y, x, data){
       model <- gam(as.formula(paste(y, "~", x)), data = data)
      result <- summary(model)$p.table
       estimate <- result[2,1]
      se <- result[2,2]
       df <- data.frame(estimate = estimate, se = se)
       df
      }
    
     my_gam(y = 'mpg', x = 'cyl', data = mtcars)
     #  estimate        se
     #1 -2.87579 0.3224089
    

    或者另一种选择是将公式作为参数传递

    my_gam <- function(fmla, data){
       model <- gam(fmla, data = data)
      result <- summary(model)$p.table
       estimate <- result[2,1]
      se <- result[2,2]
       df <- data.frame(estimate = estimate, se = se)
       df
      }
    
     my_gam(mpg ~ cyl, data = mtcars)
    #  estimate        se
    # 1 -2.87579 0.3224089
     
    

    【讨论】:

      【解决方案2】:

      您可以使用reformulate/as.formula 来构造公式。

      library(mgcv)
      
      my_gam <- function(y, x, data){
        model = gam(reformulate(x, y), data = data)
        result = summary(model)$p.table
        estimate = result[2,1]
        se = result[2,2]
        df = data.frame(estimate = estimate, se = se)
        df
      }
      
      my_gam(y = 'mpg', x = 'cyl', data = mtcars)
      #   estimate     se
      #1   -2.876 0.3224
      

      【讨论】:

      • 这是一个好办法,但在我的实际情况下,我有很多非标准的变量名,例如J45_46.&gt;=81。我该如何解决这个错误:rename(mtcars, 'J45_46.&gt;=81' = 'mpg'); f = reformulate('cyl', 'J45_46.&gt;=81'); model = gam(f, data = mtcars)
      • 哦..这似乎是一个不同的问题。也许gam 不允许使用非标准名称,然后尝试将列重命名为标准名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      相关资源
      最近更新 更多