Я пытаюсь написать свою собственную функцию моделирования в R, которая принимает формулу, некоторые данные и, возможно, некоторый дополнительный контекст, например, веса;после вызова model.frame
для извлечения необходимых числовых данных он выполнит подгонку.Мой первый проход выглядел так:
my_modfunc <- function(formula,data,weights=NULL) {
mf <- model.frame(formula,data=data,weights=weights)
wt <- model.weights(mf)
# do some fitting here...
}
# make fake data to test it
set.seed(1234)
data <- data.frame(x1=rnorm(50),x2=rnorm(50),y=rnorm(50),w=runif(50))
# call it:
my_modfunc(y ~ x1 + x2,data=data,weights=w)
Это не удалось, я получаю ошибку:
Error in model.frame.default(formula, data = data, weights = weights) :
invalid type (closure) for variable '(weights)'
Аналогично, если я звоню
my_modfunc(y ~ x1 + x2,data=data,weights='w')
, я получаю то же самоеошибка.Я подозреваю, что есть некоторые проблемы с окружением, цитированием и так далее.
Обрезая и вставляя источник для lm
, я мог бы переписать мою функцию как
# based on lm
weird_modfunc <- function(formula,data,weights=NULL ) {
cl <- match.call() # what?
mf <- match.call(expand.dots = FALSE) # what??
m <- match(c("formula", "data", "weights"), names(mf), 0L)
mf <- mf[c(1L, m)] # ??
mf$drop.unused.levels <- TRUE # ??
mf[[1L]] <- quote(stats::model.frame) ## ???
mf <- eval(mf, parent.frame())
wt <- as.vector(model.weights(mf))
# do some fitting here...
}
# this runs without error:
weird_modfunc(y ~ x1 + x2,data=data,weights=w)
# this fails with the same error as above about variable lengths.
weird_modfunc(y ~ x1 + x2,data=data,weights='w')
Проблема в том, что это содержит несколько несколько мистических заклинаний, которые я делаюне знаю, как интерпретировать, изменять или поддерживать.
Как правильно позвонить model.frame
?Бонусные баллы за выполнение моей функции принимаются как weights=w
и weights='w'