1

いくつかのグループを持つデータセット「キーワード」があります。glm を各グループに個別に適用して、グループごとに 1 つのフィットを持つ 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 クラス オブジェクトを返すのに対し、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"

フィットのパラメーターを除いて、すべての情報が失われています。リストに関するすべての情報を強制的に保持する方法はありますか?

ps、plyrツールボックスを使用してみましたが、キーワードにスペースが含まれているために動かなくなりました。

pps、この投稿には「by」というタグを付ける必要がありますが、そのタグを作成できません (stackoverflow の新機能)。

4

2 に答える 2

2

試す

lapply(CTR.glm,summary)

リストには、必要な情報が含まれているモデル オブジェクトが含まれている可能性があります。

于 2012-10-24T19:40:36.907 に答える
0

私はplyrうまくいくはずだと思います。keywordsあなたのandの構造はわかりませんが、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 に答える