1

我有一个包含多个组的数据集“关键字”。我想将 glm 单独应用于每个组,以创建一个 glm 列表适合每个组。

我可以用for循环来做到这一点,但这不是 R 精神。相反,我尝试使用by函数来做到这一点:

CTR.glm <- by(keywords,keywordsInSample,
          function(x) ifelse(nlevels(factor(x$AveragePosition))>20, # only these keywords will be fit
                             glm(Clicks ~ poly(log(AveragePosition),2) + offset(log(Impressions)),
                                 family = poisson,data = x),
                             NA)) # for functions that can't be fit

问题是虽然glm通常返回一个 glm 类对象,我可以从中提取各种好东西,但返回一个列表

> CTR.glm[2]
$`text of second keyword`
               (Intercept) poly(log(AveragePosition), 2)1 poly(log(AveragePosition), 2)2 
                 -3.626237                      -5.108795                      -1.751032 
> class(CTR.glm[2])
[1] "list"

除拟合参数外,所有信息均已丢失。有没有办法强制保留有关列表的所有信息?

ps,我尝试使用plyr工具箱,但它卡住了,因为我的关键字中有空格。

pps,这篇文章应该有标签“by”,但我无法创建该标签(stackoverflow 的新标签),有人可以重新标记它吗?

4

2 回答 2

2

尝试

lapply(CTR.glm,summary)

该列表可能包含模型对象,其中仍然包含您需要的信息

于 2012-10-24T19:40:36.907 回答
0

我认为plyr应该工作得很好。我不知道你的结构keywordsand keywordsInSample,但考虑到这个玩具示例工作正常:

require(plyr)
#generate some fake data, with a factor whose names have spaces in them
l <- c(rep("a a", 3), rep("a", 3), rep("b b", 3))
x <- rep(1:3, 3)
y <- rnorm(9)
d <- data.frame(keywordsInSample=grp, x=x, y=y)

lmList <- dlply(d, .(keywordsInSample), function(df) glm(df$y~df$x))
lmList$"a a"

只要您的索引变量可以强制成为一个因子,R 就会在内部将其表示为数字级别,并且不应该关心级别的名称包含什么。

于 2012-10-24T19:20:14.400 回答