矢量化glm并提取所有信息

时间:2012-10-24 18:47:35

标签: r vectorization glm tapply

我有一个包含多个组的数据集“关键字”。我想分别将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-class对象,我可以从中提取各种好东西, by 返回一个列表

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

除了适合的参数外,所有信息都已丢失。有没有办法强行保留列表的所有信息?

p.s。,我尝试使用 plyr 工具箱,但由于我的关键字中包含空格,因此卡住了。

p.p.s。,这篇文章应该有“by”标签,但我不能创建那个标签(stackoverflow的新功能),有人可以重新标记吗?

2 个答案:

答案 0 :(得分:2)

尝试

lapply(CTR.glm,summary)

列表可能包含模型对象,它们仍然具有您需要的信息

答案 1 :(得分:0)

我认为plyr应该可以正常工作。我不知道您keywordskeywordsInSample的结构,但请注意这个玩具示例运行良好:

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就会在内部将它表示为数字级别,而不应该关心这些级别的名称。