#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