4

一般的なタスクは、データセットのさまざまなサブセットに対して特定の統計分析 (anova、glm、または混合モデルなど) を実行し、出力テーブルを単一のデータフレーム内の要約係数および p 値と組み合わせる必要があることです。モデルのタイプ(aov(...)またはlm(...)またはまたはglm(...)などglmer(...))と、グループ化変数( s) 自分のデータセット内。

データフレーム内のさまざまなレベルの因子「複製」に対して特定の分析を実行したいデータフレームがあるとしますdata

data(iris)
library(car)
data=data.frame()
for (i in 1:10) {data=rbind(data,cbind(replicate=i,iris))}

を使用してbroom+dplyr、たとえば、このデータフレームの各サブセットに対して anova を実行し (レプリケートによるグループ化)、次を使用して用語「種」の p 値を保持できます。

library(devtools)
install_github("dgrtwo/broom")
library(broom)
library(dplyr)

group_by(data, replicate) %>% do(tidy(Anova(aov(Sepal.Length ~ Species, data = .),type="III"))) %>% filter(term=="Species")

Source: local data frame [10 x 6]
Groups: replicate [10]

   replicate    term    sumsq    df statistic      p.value
       (int)   (chr)    (dbl) (dbl)     (dbl)        (dbl)
1          1 Species 189.6364     2  362.6614 2.580311e-94
2          2 Species 189.6364     2  362.6614 2.580311e-94
3          3 Species 189.6364     2  362.6614 2.580311e-94
4          4 Species 189.6364     2  362.6614 2.580311e-94
5          5 Species 189.6364     2  362.6614 2.580311e-94
6          6 Species 189.6364     2  362.6614 2.580311e-94
7          7 Species 189.6364     2  362.6614 2.580311e-94
8          8 Species 189.6364     2  362.6614 2.580311e-94
9          9 Species 189.6364     2  362.6614 2.580311e-94
10        10 Species 189.6364     2  362.6614 2.580311e-94

(ここでは例として、10 個の同一のデータ サブセットを使用しました)

私はAnovabygroup、データフレーム、グループ化変数 (ここreplicateでは、いくつかのグループ化変数の組み合わせである可能性もあります)、実行するモデルのタイプ (たとえば、このcase'aov(Sepal.Length ~ Species, data = .)'ですが、lm、glm、lme、lmer、glmer モデル、または によって処理されるその他のモデルでもかまいません。Anova()) および係数と p 値を返す因子 (おそらくすべてを返すオプション "all" を使用) を引数として指定します (指定された他のオプションは、Anova の呼び出しに渡すことができます)。上記で使用したものと同様のコードを使用して、これらの引数を取るために一般化されたコードを使用して、これを行う方法を知っている人はいますか? 私がどうしたらよいか分からない主なことは、モデル (例えば、この場合は `'aov(Sepal.Length ~ Species, data = .)') を引数として渡し、それを評価させることです。それとも、すでにいくつかのパッケージに存在している可能性がありますか? 私はいつもこのタスクを何度も何度もコーディングしているので、これは役立つと思います...

PS現在のCRANバージョンはAnova出力をうまく処理していないようなので、ほうきパッケージのgithubバージョンを使用しました

4

1 に答える 1

4

答え:

これは、テキスト入力を解析するラッパー関数を作成することで解決できます。ここでは、 と を使用parseevalます。

glm関数は、渡された式 ( 、など)の有効性もチェックするのが理想的lmですが、ここでは、開始するための関数の例を示します。

Anovaまた、要求に応じて追加のオプションを渡すこともできます。

anova_wrapper <- function(data, model_expression_as_string, grouping_variable,...) {
  f_wrap <- paste0('function(.) {',model_expression_as_string,'}') %>%    parse(text=.) %>% eval
  data %>% group_by_(grouping_variable) %>% 
     do(f_wrap(.) %>% Anova(...=...) %>% tidy) %>% return
}

例:

サンプルコードの使用 (良いコードを投稿していただきありがとうございます!):

data=data.frame()
for (i in 1:10) {data=rbind(data,cbind(replicate=i,iris))}

aov_model_expression_as_string = 'aov(Sepal.Length ~ Species, data = .)'
lm_model_expression_as_string = 'lm(Sepal.Length ~ Sepal.Width + Petal.Length , data = .)'
grouping_variable = 'replicate'


data %>% 
    anova_wrapper(model_expression_as_string = aov_model_expression_as_string,
                  grouping_variable = grouping_variable,type="III")



    Source: local data frame [30 x 6]
    Groups: replicate [10]

    replicate        term      sumsq    df statistic       p.value
    (int)       (chr)      (dbl) (dbl)     (dbl)         (dbl)
    1          1 (Intercept) 1253.00180     1 4728.1630 1.134286e-113
    2          1     Species   63.21213     2  119.2645  1.669669e-31
    3          1   Residuals   38.95620   147        NA            NA
    4          2 (Intercept) 1253.00180     1 4728.1630 1.134286e-113
    5          2     Species   63.21213     2  119.2645  1.669669e-31
    6          2   Residuals   38.95620   147        NA            NA
    7          3 (Intercept) 1253.00180     1 4728.1630 1.134286e-113
    8          3     Species   63.21213     2  119.2645  1.669669e-31
    9          3   Residuals   38.95620   147        NA            NA
    10         4 (Intercept) 1253.00180     1 4728.1630 1.134286e-113
    ..       ...         ...        ...   ...       ...           ...

lmの代わりにaov別の引数を使用するAnova:

data %>% 
    anova_wrapper(model_expression_as_string = lm_model_expression_as_string,
                  grouping_variable = grouping_variable,type="III")



    replicate         term    sumsq    df statistic      p.value
    (int)        (chr)    (dbl) (dbl)     (dbl)        (dbl)
    1          1  Sepal.Width  8.19627     1  73.78707 1.163254e-14
    2          1 Petal.Length 84.42733     1 760.05861 5.847914e-60
    3          1    Residuals 16.32876   147        NA           NA
    4          2  Sepal.Width  8.19627     1  73.78707 1.163254e-14
    5          2 Petal.Length 84.42733     1 760.05861 5.847914e-60
    6          2    Residuals 16.32876   147        NA           NA
    7          3  Sepal.Width  8.19627     1  73.78707 1.163254e-14
    8          3 Petal.Length 84.42733     1 760.05861 5.847914e-60
    9          3    Residuals 16.32876   147        NA           NA
    10         4  Sepal.Width  8.19627     1  73.78707 1.163254e-14
    ..       ...          ...      ...   ...       ...          ...

私は定期的にモンテカルロシミュレーションでこれらのタイプの回帰/アノバスを繰り返しますが、通常は分析の種類ごとに個別の関数を作成します。これらの分析を繰り返し行うパッケージには、R コミュニティからの関心が寄せられる可能性があります。

于 2015-11-20T19:10:51.553 に答える