То, что объяснил Рамнатх, совершенно верно. Но я немного уточню.
ddply
ожидает кадр данных и затем возвращает кадр данных. Функция lm()
принимает фрейм данных в качестве входных данных, но возвращает объект линейной модели в ответ. Вы можете увидеть это, посмотрев документы для lm через ?lm
:
Значение
lm возвращает объект класса "lm" или для нескольких ответов класса
с ("млм", "лм").
Так что вы не можете просто поместить объекты lm во фрейм данных. Вы можете либо принудительно настроить вывод lm
во фрейм данных, либо вы можете поместить объекты lm в список вместо фрейма данных.
Итак, чтобы проиллюстрировать оба варианта:
Вот как можно поместить объекты lm в список (очень похоже на то, что проиллюстрировал Рамнатх):
outlist <- dlply(mydf, "x3", function(df) lm(y ~ x1 + x2, data=df))
С другой стороны, если вы хотите извлечь только коэффициенты, вы можете создать функцию, которая запускает регрессию, а затем возвращает только коэффициенты в виде фрейма данных, например:
myLm <- function( formula, df ){
lmList <- lm(formula, data=df)
lmOut <- data.frame(t(lmList$coefficients))
names(lmOut) <- c("intercept","x1coef","x2coef")
return(lmOut)
}
outDf <- ddply(mydf, "x3", function(df) myLm(y ~ x1 + x2, df))