невозможно использовать нестандартную оценку в функции self-define в r

#r #dplyr #model #evaluation

#r #dplyr #Модель #оценка

Вопрос:

Я хочу написать функцию, которая извлекает некоторую информацию из gam модели. Я могу сделать это без функции self-define ( 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
 

Затем я обернул ее функцией self-define:

 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, данные = данные) :
Недостаточно (не NA) данных для выполнения чего-либо значимого

Это способ, которым я могу получить df так же, как первый блок кода при запуске my_gam(y = mpg, x = cyl, data = mtcars) .

Любая помощь будет высоко оценена!!

Ответ №1:

Вы можете использовать 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
 

Комментарии:

1. это хороший способ, но в моей реальной ситуации у меня много нестандартных имен переменных, таких как J45_46.>=81 . Как я мог исправить эту ошибку: rename(mtcars, 'J45_46.>=81' = 'mpg'); f = reformulate('cyl', 'J45_46.>=81'); model = gam(f, data = mtcars)

2. Ооо .. это, кажется, другой вопрос. Возможно gam , не допускает нестандартных имен, попробуйте переименовать столбцы в стандартные имена.

Ответ №2:

Мы можем построить формулу, с 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