Доступ к fit.values ​​при использовании ddply

Я использую ddply для выполнения glm на подмножествах моих данных. У меня возникают трудности с доступом к оценочным значениям Y. Я могу получить оценки параметров модели, используя приведенный ниже код, но все варианты, которые я пытался получить, не увенчались успехом. Зависимые и независимые переменные в модели glm являются векторами-столбцами, как и переменная "Dmsa", используемая в операции ddply.

Определите модель:

Model <- function(df){coef(glm(Y~D+O+B+A+log(M), family=poisson(link="log"), data=df))}

Выполните модель на подмножествах:

Modrpt <- ddply(msadata, "Dmsa", Model)

Вывод Modrpt дает коэффициенты модели, но не оценки Y.

Я знаю, что если бы я не использовал ddply, я мог бы получить доступ к glm оценочным значениям Y, используя код:

Model <- glm(Y~D+O+B+A+log(M), family=poisson(link="log"), data=msadata)

fits <- Model$fitted.values

Я пробовал оба из следующих способов, чтобы получить подходящие значения для подмножеств, но не повезло:

fits <- fitted.values(ddply(msadata, "Dmsa", Model))

fits <- ddply(msadata, "Dmsa", fitted.values(Model))

Я уверен, что это очень легко кодировать... к сожалению, я только изучаю R. Кто-нибудь знает, где я ошибаюсь?


person Carter    schedule 06.08.2013    source источник
comment
Пожалуйста, сделайте пример воспроизводимым, предоставив некоторые образцы данных, например. dput( msadata) или используйте встроенный набор данных, например data(iris)   -  person Simon O'Hanlon    schedule 06.08.2013
comment
Просто замените coef на fitted в вашей функции Model.   -  person agstudy    schedule 06.08.2013


Ответы (2)


Вы можете использовать анонимную функцию в своем вызове ddply, например.

require(plyr)
data(iris)
model <- function(df){
    lm( Petal.Length ~ Sepal.Length + Sepal.Width , data = df )
    }

ddply( iris , "Species" , function(x) fitted.values( model(x) ) ) 

Это имеет то преимущество, что вы также можете, не переписывая свою функцию model, получить значенияcoef, выполнив

    ddply( iris , "Species" , function(x) coef( model(x) ) ) 

Как указывает @James, это упадет, если у вас есть разбиения неравного размера, лучше использовать dlply, который помещает результат каждого подмножества в свой собственный элемент списка.

(Я не претендую на статистическую значимость или правильность примера модели — это просто пример)

person Simon O'Hanlon    schedule 06.08.2013
comment
Это работает только в том случае, если расщепления имеют одинаковый размер. Чтобы использовать это более широко, используйте dlply вместо ddply. - person James; 06.08.2013
comment
Саймон, я думаю, это почти то, что мне нужно. Используя этот код, я могу заставить работать версию coef (ваша нижняя строка кода), но когда я использую код fitted.values, я получаю следующую ошибку: Error in list_to_dataframe(res, attr(.data, "split_labels")) : Results do not have equal lengths. Любая идея, что может быть причиной этого? - person Carter; 06.08.2013
comment
Да, прочитайте комментарий Джеймса выше и используйте dlply вместо ddply, у вас неравные разбиения в ваших данных (возвращаемые кадры данных не имеют одинакового количества столбцов) - person Simon O'Hanlon; 06.08.2013
comment
Да, взялся за дело! Спасибо Джеймсу и Саймону. Чтобы уточнить, если у меня есть 5 подмножеств, я должен получить 5 выходных списков, используя dlply, правильно? Как тогда мне объединить эти списки в виде векторов, где каждый список является вектором-строкой (т. е. в результате получается 5 строк со столбцом для каждого наблюдения)? - person Carter; 06.08.2013
comment
Итак, с помощью cbind эти списки объединены в векторы. Еще раз спасибо за помощь. - person Carter; 06.08.2013
comment
Еще один вопрос, если вы не возражаете... так как он основан на этом. В конечном счете, я пытаюсь убедиться, что сумма оценочных значений Y для каждого подмножества равна сумме наблюдаемых значений Y. cbind позволил мне получить эти списки в виде векторов-строк (с двумя столбцами), но все оценки Y для каждого подмножества содержатся в одной ячейке для строки как c(1435.234, 8778.1389, ....). Есть ли способ получить сумму этих оценок в функции cbind? Я знаю, что могу использовать total = sum(model$outlistname) для получения суммы для отдельного списка, но теперь знаю, как автоматизировать это в cbind. - person Carter; 06.08.2013
comment
Почему сумма оцененного равна наблюдаемому? Вы имеете в виду длину? Я не думаю, что понимаю, что вы имеете в виду. Может быть, лучше задать другой вопрос? Иллюстрирую данными. - person Simon O'Hanlon; 06.08.2013

Я рекомендую делать это в два этапа:

library(plyr)

# First first the models
models <- dlply(iris, "Species", lm, 
  formula = Petal.Length ~ Sepal.Length + Sepal.Width )

# Next, extract the fitted values
ldply(models, fitted.values)

# Or maybe
ldply(models, as.data.frame(fitted.values))
person hadley    schedule 07.08.2013