我有一个包含多个组的数据集“关键字”。我想分别将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的新功能),有人可以重新标记吗?
答案 0 :(得分:2)
尝试
lapply(CTR.glm,summary)
列表可能包含模型对象,它们仍然具有您需要的信息
答案 1 :(得分:0)
我认为plyr
应该可以正常工作。我不知道您keywords
和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就会在内部将它表示为数字级别,而不应该关心这些级别的名称。