这个问题建立在Simon和James提供here
的答案之上 dlply
函数很好地在我的数据子集中给出了Y估计值。现在,我的挑战是将这些Y估计值和残差重新计入原始数据框,以计算拟合度统计数据和进一步分析。
我能够使用cbind
将dlply
输出列表转换为行向量,但结果并不是很好(对于糟糕的降价感到抱歉)。
model <- function(df){ glm(Y~D+O+A+log(M), family=poisson(link="log"), data=df)}
Modrpt <- ddply(msadata, "Dmsa", function(x)coef(model(x)))
Modest <- cbind(dlply(msadata, "Dmsa", function(x) fitted.values(model(x))))
Subset name | Y_Estimates
-------------------------
Dmsa 1 | c(4353.234, 234.34,...
Dmsa 2 | c(998.234, 2543.55,...
这并不能真正回复邮件,因为我需要将{Y}个数据框的Y_estimates列中的单个Y估计值(由逗号分隔)加到我的Modest
数据框中。 / p>
理想情况下,我知道这是不正确的,但我会在这里举一个例子,我想做这样的事情:
msadata
如果我可以将列表分解为单个Y估计值,我可以通过msadata$Y_est <- cbind(dlply(msadata, "Dmsa", function(x)fitted.values(model(x))))
将其加入msadata
数据框。我觉得这与迈克尔的答案here非常相似,但在采用迈克尔的"Dmsa"
或join()
建议之前,需要一些内容来区分列表元素。有什么想法吗?
答案 0 :(得分:2)
在上一个问题中,我提出了一个data.table
解决方案。我认为它更适合您想要做的事情,因为您希望按组应用模型,然后将结果与原始数据汇总。
library(data.table)
DT <- as.data.table(df)
models <- DT[,{
mod= glm(Y~D+O+A+log(M), family=poisson(link="log"))
data.frame(res= mod$residuals,
fit=mod$fitted.values,
mod$model)
},
by = Dmsa]
这是一个带有一些数据的应用程序:
## create some data
set.seed(1)
d.AD <- data.frame(
counts = sample(c(10:30),18,rep=TRUE),
outcome = gl(3,1,18),
treatment = gl(3,6),
type = sample(c(1,2),18,rep=TRUE) ) ## type is the grouping variable
## corece data to a data.table
library(data.table)
DT <- as.data.table(d.AD)
## apply models
DT[,{mod= glm(formula = counts ~ outcome + treatment,
family = poisson())
data.frame(res= mod$residuals,
fit=mod$fitted.values,
mod$model)},
by = type]
type res fit counts outcome treatment
1: 1 -3.550408e-01 23.25729 15 1 1
2: 1 2.469211e-01 23.25729 29 1 1
3: 1 9.866698e-02 25.48543 28 3 1
4: 1 5.994295e-01 18.13147 29 1 2
5: 1 4.633974e-16 23.00000 23 2 2
6: 1 1.576093e-01 19.86853 23 3 2
7: 1 -3.933199e-01 18.13147 11 1 2
8: 1 -3.456991e-01 19.86853 13 3 2
9: 1 6.141856e-02 22.61125 24 1 3
10: 1 4.933908e-02 24.77750 26 3 3
11: 1 -1.154845e-01 22.61125 20 1 3
12: 2 9.229985e-02 15.56349 17 1 1
13: 2 5.805515e-03 21.87302 22 2 1
14: 2 -1.004589e-01 15.56349 14 1 1
15: 2 2.537653e-16 14.00000 14 1 2
16: 2 -1.603110e-01 21.43651 18 1 3
17: 2 1.662347e-01 21.43651 25 1 3
18: 2 -4.214963e-03 30.12698 30 2 3