R - как передать формулу в конструкцию with(df, glm(y ~ x)) внутри функции

Я использую mice пакет в R, чтобы умножить-вменять некоторые недостающие данные. Мне нужно иметь возможность указать формулу, которая передается with(df, glm(y ~ x)) построение внутри функции. это with() конструкция является форматом, используемым mice пакет, чтобы соответствовать регрессионной модели отдельно в каждом из вмененных наборов данных.

Тем не менее, я не могу понять проблемы с областями видимости, мешающие мне успешно передать формулу в качестве аргумента. Вот воспроизводимый пример:

library(mice)

data(mtcars)
mtcars[5, 5] <- NA # introduce a missing value to be imputed

mtcars.imp = mice(mtcars, m = 5)

# works correctly outside of function
with(mtcars.imp, glm(mpg ~ cyl))

fit_model_mi = function(formula) {
  with(mtcars.imp, glm(formula))
}

# doesn't work when trying to pass formula into function   
fit_model_mi("mpg ~ cyl")

Также смотрите здесь тот же вопрос, который задают в справке R, хотя он не получает ответа.

2 ответа

Решение

Попробуйте обернуть формулу в as.formula

fit_model_mi = function(formula) {
    with(mtcars.imp, glm(as.formula(formula)) )
}

Кажется, работает:

> fit_model_mi("mpg ~ cyl")
call :
with.mids(data = mtcars.imp, expr = glm(as.formula(formula)))

call1 :
mice(data = mtcars, m = 5)

nmis :
 mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
   0    0    0    0    1    0    0    0    0    0    0 

analyses :
[[1]]

Call:  glm(formula = as.formula(formula))

Coefficients:
(Intercept)          cyl  
     37.885       -2.876  

Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
Null Deviance:      1126 
Residual Deviance: 308.3    AIC: 169.3

Вы также можете attach ваши данные по

attach(mtcars)

Результат показан

fit_model_mi("mpg ~ cyl")
call :
with.mids(data = mtcars.imp, expr = glm(formula))

call1 :
mice(data = mtcars, m = 5)

nmis :
 mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
   0    0    0    0    1    0    0    0    0    0    0 

analyses :
[[1]]

Call:  glm(formula = formula)

Coefficients:
(Intercept)          cyl  
     37.885       -2.876  

Degrees of Freedom: 31 Total (i.e. Null);  30 Residual
Null Deviance:      1126 
Residual Deviance: 308.3    AIC: 169.3
Другие вопросы по тегам