8

私は R の初心者ユーザーであり、ggplot2 と plyr の優雅さを高く評価するようになりました。現在、ここで共有できない大規模なデータセットを分析しようとしていますが、ダイヤモンド データセット (便宜上省略) を使用して問題を再構築しました。難しい話は抜きにして:

diam <- diamonds[diamonds$cut=="Fair"|diamonds$cut=="Ideal",]
boxplots <- ggplot(diam, aes(x=cut, price)) + geom_boxplot(aes(fill=cut)) + facet_wrap(~ color)
print(boxplots)

プロットが生成するのは、2 つのカット "Fair" と "Ideal" の価格を比較する一連の箱ひげ図です。

t.test または wilcox.test のいずれかを使用して、各カラー サブグループ (D、E、F、..、J) の 2 つのカットを統計的に比較することで、次のステップに進みたいと思います。

ggplot2-syntax と同じくらいエレガントな方法でこれを実装するにはどうすればよいですか? plyr-package の ddply を使用すると思いますが、適切な統計を計算する関数に 2 つのサブグループをフィードする方法がわかりませんでした..

4

2 に答える 2

12

私はあなたが探していると思います:

library(plyr)
ddply(diam,"color",
      function(x) {
          w <- wilcox.test(price~cut,data=x)
          with(w,data.frame(statistic,p.value))
      })

t.test( for の代入でwilcox.testもうまくいくようです。)

結果:

  color statistic      p.value
1     D  339753.5 4.232833e-24
2     E  591104.5 6.789386e-19
3     F  731767.5 2.955504e-11
4     G  950008.0 1.176953e-12
5     H  611157.5 2.055857e-17
6     I  213019.0 3.299365e-04
7     J   56870.0 2.364026e-01
于 2012-09-26T16:50:24.737 に答える
2

ddplyは出力としてデータフレームを返します。私があなたの質問を正しく読んでいると仮定すると、それはあなたが探しているものではありません。データの一連のサブセットを使用して一連のt検定を実行したいので、実際のタスクはそれらのサブセットのリストをコンパイルすることだけだと思います。それらを取得したら、lapply()などの関数を使用して、リスト内の各サブセットに対してt検定を実行できます。これが最も洗練された解決策ではないと確信していますが、1つのアプローチは、次のような関数を使用して、色の一意のペアのリストを作成することです。

get.pairs <- function(v){
  l <- length(v)
  n <- sum(1:l-1)
  a <- vector("list",n)
  j = 1
  k = 2
  for(i in 1:n){
    a[[i]] <- c(v[j],v[k])
    if(k < l){
      k <- k + 1
    } else {
     j = j + 1
     k = j + 1
    }
  }
 return(a)
}

これで、その関数を使用して、一意の色のペアのリストを取得できます。

> (color.pairs <- get.pairs(levels(diam$color))))
[[1]]
[1] "D" "E"

[[2]]
[1] "D" "F"

...

[[21]]
[1] "I" "J"

これで、これらの各リストを使用して、次のように、データフレームのサブセットでt.test(または必要なもの)を実行できます。

> t.test(price~cut,data=diam[diam$color %in% color.pairs[[1]],])

    Welch Two Sample t-test

data:  price by cut 
t = 8.1594, df = 427.272, p-value = 3.801e-15
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 1008.014 1647.768 
sample estimates:
 mean in group Fair mean in group Ideal 
           3938.711            2610.820

次に、lapply()を使用して、色のペアのリスト内の各サブセットに対してテストを実行します。

> lapply(color.pairs,function(x) t.test(price~cut,data=diam[diam$color %in% x,]))
[[1]]

    Welch Two Sample t-test

data:  price by cut 
t = 8.1594, df = 427.272, p-value = 3.801e-15
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 1008.014 1647.768 
sample estimates:
 mean in group Fair mean in group Ideal 
           3938.711            2610.820 

...

[[21]]

    Welch Two Sample t-test

data:  price by cut 
t = 0.8813, df = 375.996, p-value = 0.3787
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval:
 -260.0170  682.3882 
sample estimates:
 mean in group Fair mean in group Ideal 
       4802.912            4591.726 
于 2012-09-26T16:37:37.457 に答える