4

这个问题建立在 Simon 和 James在此处提供的答案之上

dlply函数运行良好,可以在我的数据子集中给我 Y 估计值。现在,我的挑战是将这些 Y 估计值和残差返回到原始数据框中,以计算拟合优度统计数据并进行进一步分析。

我可以用来cbinddlply输出列表转换为行向量,但这并不能很好地工作,因为结果是(对不起降价差)。

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 估计值(在Modest数据框的 Y_estimates 列中用逗号分隔)放入我的msadata数据框中。

理想情况下,我知道这是不正确的,但我会在这里举个例子,我想做这样的事情:

msadata$Y_est <- cbind(dlply(msadata, "Dmsa", function(x)fitted.values(model(x))))

如果我可以将列表分解为单独的 Y 估计值,我可以将它加入到我的msadata数据框中"Dmsa"。我觉得这与迈克尔在这里join()的回答非常相似,但在采用迈克尔的or建议之前,需要将列表元素分开merge()。有任何想法吗?

4

1 回答 1

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
于 2013-08-06T17:07:16.123 回答