2016-12-14 13 views
0

glmを使用して、グループごとにモデルをモデルデータに適合させます。信頼区間の上限と下限の列を追加する:confintを2回呼び出すことを避けるにはどうすればよいですか?一般的に、dplyr::mutateを使用して新しい列に汎用出力を割り当てる方法はありますか?要するにdplyr :: mutateの関数呼び出しの結果を再利用

df <- data.frame(
    x = rep(c("a", "b"), each=10), 
    y = c(rpois(10, 0.5), rpois(10, 2.2))) 

sdf <- df %>% 
    group_by(x) %>% 
    do(fit=glm(y ~ 1, poisson, data=.)) 

mutate(sdf, 
    est=coef(fit), 
    cil=confint(fit)[1], 
    ciu=confint(fit)[2]) 

、私は仕事にこれをしたい:

mutate(sdf, ci=confint(fit)) %>% 
    mutate(cil=ci[1], ciu=ci[2]) 

私は再びdoを使用している場合は、私はフィットモデルとxを失います。

ソリューション

私が実際に使用したもの(受け入れ答えから学んだ):

sdf <- df %>% 
    group_by(x) %>% 
    do({ 
    fit <- glm(y ~ 1, poisson, data=.) 
    ci <- confint(fit) 
    data.frame(
     est=coef(fit), 
     cil=ci[1], 
     ciu=ci[2]) 
    }) 
+3

[broom](https://github.com/tidyverse/broom)を見ましたか?そのモデル出力をデータフレームの列として取得するのに役立ちます。 – Ben

+0

@Benの提案は、 '' doコール。 – Benjamin

+1

私はこの種の作業に 'purr'を使うことも考えています。 'do'を使うことができますが、' 'purr''の' 'map''関数は柔軟性を提供します。 –

答えて

1

上記のコメントのすべてはあなたの問題を支援するための素敵な新しいパッケージです(私は非常にpurrrをお勧めします) doに固執したい場合は、このように再フォーマットすることができますので、グループあたり1回だけconfintを呼び出してください:

sdf <- df %>% 
    group_by(x) %>% 
    do({fit <- glm(y ~ 1, poisson, data=.); 
     data.frame(confint(fit), coef(fit))}) 

出力はplotable形式に入るためにいくつかの作業が必要です。

コメントで尋ねたよう
sdf %>% mutate(ci = rep(c("low", "high"), legnth.out = nrow(.))) %>% spread(ci, confint.fit.) 
+0

余分な編集をして申し訳ありません(コピーペーストの間違いは ';'が間違った言葉である必要があると思いました)。 – Ian

+0

心配する必要はありません、あなたは正しいと私はそれを受け入れた理由は、混乱のため申し訳ありません – Nate

2

、ここdplyrpurrrtidyrbroomを使用してのアプローチです。

library(purrr) 
library(tidyr) 
library(dplyr) 
library(broom) 

sdf <- df %>% 
    nest(y) %>% 
    mutate(model = map(data, ~glm(y ~ 1, poisson, data = .))) %>% 
    unnest(map(model, tidy)) 

Source: local data frame [2 x 8] 

     x   data  model  term estimate std.error statistic  p.value 
    (fctr)   (chr)  (chr)  (chr)  (dbl)  (dbl)  (dbl)  (dbl) 
1  a <tbl_df [10,1]> <S3:glm, lm> (Intercept) -0.5108256 0.4082458 -1.251270 2.108361e-01 
2  b <tbl_df [10,1]> <S3:glm, lm> (Intercept) 1.0296194 0.1889795 5.448311 5.085025e-08 

私はよりおよそpurrrtidyrbroomグーグル経由して、パッケージビネットを読んでいました。 RStudio Blog about tidyverse packagesには多くの良い情報もあります。

関連する問題