У меня есть кадр данных с коэффициентом (grpfactor). Моя цель состоит в том, чтобы вычислить остатки, устанавливая модель lm отдельно в каждой группе и сохраняя их в исходном фрейме данных.ddply ошибка? (Добавление остатков lm, вычисленных в группах обратно в исходный кадр данных)
Модель должна быть указана во время выполнения (т. Е. Не может быть фиксированной строкой).
Я нашел this answer
ddply(d,.(g1,g2),transform,z= predict(lm(y ~ x)))
Это, кажется, работает с статический определенной формулой, но если я поставил код внутри функции и использовать переменную строку вместо строкового литерала (константа), он терпит неудачу - - Зачем??
d <- data.frame(x = rnorm(20),
y = rnorm(20),
g1 = c(rep('a', 10), rep('b', 10)),
g2 = rep(c(rep('c', 5), rep('d', 5)), 2))
myfunc = function(d) {
xx = "y ~ x"
retval = ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))
return(retval)
}
# This fails:
d.new = myfunc(d)
# With the error:
#Error: error in evaluating the argument 'object' in selecting a
#method for function 'predict': Error in as.formula(xx) : object 'xx' not
#found
# But this works, because it's not encased in a function:
xx = "y ~ x"
retval = ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))
#Now, with the variable "xx" defined two lines above this line,
#the following will actually work now:
d.new = myfunc(d)
#But if we do this, it will fail again:
rm(xx)
d.new = myfunc(d)
#ddply works inside a function, but only with a model specified
#as a literal string:
myfunc2 = function(d) {
retval = ddply(d,.(g1,g2),transform,z= predict(lm(formula=as.formula("y ~ x"))))
return(retval)
}
d.new2 = myfunc2(d)
Как и в сторону, без as.formula, myfunc2 завершается с ошибкой:
#Error: error in evaluating the argument 'object' in selecting a method
#for function 'predict': Error in eval(expr, envir, enclos) : object 'y'
#not found
Но тот же код работает без as.formula, если это не в функции.
Что происходит?
Edit: хорошо, вот где она становится действительно сумасшедшей: это работает (разница, я определяю модель в родительской среде с использованием < < -)
myfunc3 = function(d) {
xx <<- "y ~ x"
retval = ddply(d,.(g1,g2),transform,z= predict(lm(as.formula(xx))))
return(retval)
}
myfunc3(d)
Похоже, я отметил, что ответил слишком рано! Как только я вложу ddply внутри функции, она больше не работает. Я редактирую исходный вопрос с помощью лучшего примера игрушек, чтобы продемонстрировать ошибку. – Dimitri
@Dimitri это ошибка в 'ddply'. Вы можете увидеть [здесь] (http://stackoverflow.com/questions/3149150/ddply-run-in-a-function-looks-in-the-environment-outside-the-function) для более подробной информации – agstudy