Другая проблема, которая может вызвать это, если передать character
(строка vector
) в lm
вместо formula
.vector
s не имеют environment
, и поэтому, когда lm
преобразует character
в formula
, у него, по-видимому, также нет environment
вместо того, чтобы автоматически назначаться локальной среде.Если затем использовать в качестве весов объект, которого нет в аргументе данных data.frame
, но есть в аргументе локальной функции, он получает ошибку not found
.Такое поведение не очень легко понять.Это, вероятно, ошибка.
Вот минимальный воспроизводимый пример.Эта функция использует data.frame
, два имени переменной и вектор весов для использования.
residualizer = function(data, x, y, wtds) {
#the formula to use
f = "x ~ y"
#residualize
resid(lm(formula = f, data = data, weights = wtds))
}
residualizer2 = function(data, x, y, wtds) {
#the formula to use
f = as.formula("x ~ y")
#residualize
resid(lm(formula = f, data = data, weights = wtds))
}
d_example = data.frame(x = rnorm(10), y = rnorm(10))
weightsvar = runif(10)
И проверка:
> residualizer(data = d_example, x = "x", y = "y", wtds = weightsvar)
Error in eval(expr, envir, enclos) : object 'wtds' not found
> residualizer2(data = d_example, x = "x", y = "y", wtds = weightsvar)
1 2 3 4 5 6 7 8 9 10
0.8986584 -1.1218003 0.6215950 -0.1106144 0.1042559 0.9997725 -1.1634717 0.4540855 -0.4207622 -0.8774290
Это очень тонкая ошибка.Если вы войдете в функциональную среду с помощью browser
, вы можете увидеть вектор весов очень хорошо, но его как-то не найти в вызове lm
!
Ошибка становится еще труднее отлаживать, если ее использоватьимя weights
для переменной веса.В этом случае, поскольку lm
не может найти объект весов, по умолчанию используется функция weights()
из base , что приводит к появлению еще более странной ошибки:
Error in model.frame.default(formula = f, data = data, weights = weights, :
invalid type (closure) for variable '(weights)'
Don 'не спрашивайте меня, сколько часов мне понадобилось, чтобы понять это.