使用ddply时访问fitting.values

时间:2013-08-06 13:52:44

标签: r plyr subset glm

我正在使用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.有谁知道我哪里出错?

2 个答案:

答案 0 :(得分:3)

您可以在致电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将每个子集的结果放在它自己的列表元素中。

我没有声明示例模型的统计相关性或正确性 - 它只是一个例子

答案 1 :(得分:0)

我建议分两步执行此操作:

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))