8

我是 R 的新手,并且开始欣赏 ggplot2 和 plyr 的优雅。现在,我正在尝试分析一个我无法在此处共享的大型数据集,但我已经用 Diamonds 数据集(为方便起见缩短了)重建了我的问题。无需再费周折:

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)

该情节产生的是一组箱线图,比较了“公平”和“理想”两个剪辑的价格。

我现在非常想继续使用 t.test 或 wilcox.test 对每个颜色子组 (D,E,F,..,J) 的两个削减进行统计比较。

我将如何以与 ggplot2-syntax 一样优雅的方式实现它?我假设我会使用 plyr-package 中的 ddply,但我不知道如何将两个子组输入到计算适当统计数据的函数中。

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可以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 检验。我确信这不是最优雅的解决方案,但一种方法是使用如下函数创建一个独特的颜色对列表:

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 回答