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