Я пишу функцию, которая требует взвешенной регрессии. Я неоднократно получал ошибку с параметром веса, и я создал минимальный воспроизводимый пример, который вы можете найти здесь:
wt_reg <- function(form, data, wts) {
lm(formula = as.formula(form), data = data,
weights = wts)
}
wt_reg(mpg ~ cyl, data = mtcars, wts = 1:nrow(mtcars))
Это возвращает
Ошибка в eval (extras, data, env): объект wts не найден
Если вы запустите все это отдельно, все будет нормально. Я покопался в lm, и, похоже, проблема связана с вызовом eval(mf, parent.frame())
. Несмотря на то, что wts находится в parent.frame (), он, похоже, не правильно оценивается в вызове. Вот еще немного подробностей:
mf назначается так, что он такой же, как
stats::model.frame(formula = as.formula(form), data = data, weights = wts,
drop.unused.levels = TRUE)
Когда я бегу
parent.frame()$wts
он возвращает числовой вектор. Но когда я бегу
eval(stats::model.frame(formula = as.formula(form), data = data, weights = wts,
drop.unused.levels = TRUE), parent.frame())
это не так.
Я могу бегать
stats::model.frame(formula = as.formula(parent.frame()$form),
data = parent.frame()$data, weights = parent.frame()$wts,
drop.unused.levels = TRUE)
и это работает. Вы можете проверить это сами, если хотите, используя пример сверху.
Есть предположения? Я действительно понятия не имею, что здесь происходит ...