应用双样本 t.test 比较两个类别中的多个组

机器算法验证 r
2022-03-21 08:43:49

我想做一个两个样本的 t.test 比较几个组的两个区域的值。我知道这一定是一个简单的技巧,但到目前为止我找不到答案。

这是我的表格的简短版本。来自 2 个地区的几个物种(每个地区每个物种通常有 6 个标本)。

species region   N15     
ARGAFF     EQ    9.85     
ARGAFF     EQ   10.42   
ARGAFF     EQ   10.43  
ARGAFF    OMZ   10.28  
ARGAFF    OMZ   10.30   
ARGAFF    OMZ   10.41  
BATABY     EQ   10.57      
BATABY     EQ   10.60      
BATABY     EQ   10.68        
BATABY    OMZ    9.21       
BATABY    OMZ    9.29       
BATABY    OMZ    9.67       

我试过

spp<-split(SIA,species,drop=FALSE) 

其次是

lapply(spp,function (x) t.test(N15~region))

我进一步尝试

by(SIA[,3], SIA[, "species"], function (x) t.test(N15~region))

但是两个版本都计算了所有值的测试(N.138,而不仅仅是单个物种(N:12)。

另一方面

 by(SIA[,3], SIA[, "species"], t.test)

导致一个样本测试,但针对个别物种。

我会很感激建议。

3个回答

有多种方法可以做到这一点,但我正在使用 dplyr 和 broom 包的组合。此过程的优点是您可以将 t 检验信息导出为数据集:

library(dplyr)
library(broom)

set.seed(9)

# example dataset
dt = data.frame(species = c(rep("ARGAFF",6), rep("BATABY",6)),
                region = rep(c("EQ","OMZ"),6),
                N15 = rnorm(12,10,1))


dt_result = dt %>% group_by(species) %>% do(tidy(t.test(N15~region, data=.)))

dt_result

   #   species  estimate estimate1 estimate2 statistic   p.value parameter   conf.low conf.high
   # 1  ARGAFF 0.6029705  9.842659  9.239688  1.381967 0.2439265  3.732157 -0.6434982  1.849439
   # 2  BATABY 1.0238324 10.740491  9.716659  1.994738 0.1673019  2.300604 -0.9298488  2.977514

希望对你有效。

首先,通常附加数据集是个坏主意。你可以修改你的lapply陈述来做你想做的事情。

set.seed(9)

# example dataset
SIA <- data.frame(species = as.factor(c(rep("ARGAFF",6), rep("BATABY",6))),
                region = as.factor(rep(c("EQ","OMZ"),6)),
                N15 = rnorm(12,10,1))

spp <- split(SIA, SIA$species,drop=FALSE) 
out <- vector("list", length = length(spp))
out <- lapply(1:length(spp),function (x) out[[x]]<- t.test(spp[[x]]$N15 ~ spp[[x]]$region))

然后你可以提取你想要的任何特征。

> out
[[1]]

    Welch Two Sample t-test

data:  spp[[x]]$N15 by spp[[x]]$region
t = -0.7566, df = 2.4628, p-value = 0.515
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -4.617903  3.018924
sample estimates:
 mean in group EQ mean in group OMZ 
         9.982135         10.781625 


[[2]]

    Welch Two Sample t-test

data:  spp[[x]]$N15 by spp[[x]]$region
t = 0.66769, df = 3.2858, p-value = 0.5483
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.564611  2.448523
sample estimates:
 mean in group EQ mean in group OMZ 
        10.055578          9.613622 

Rstatix::t_test()是一个用户友好的包装器,t.test()它返回一个小标题。

library(tidyverse)
library(rstatix)

df <- tribble(~species, ~region,  ~N15,     
              "ARGAFF",    "EQ",  9.85,     
              "ARGAFF",    "EQ", 10.42,   
              "ARGAFF",    "EQ", 10.43,  
              "ARGAFF",   "OMZ", 10.28,  
              "ARGAFF",   "OMZ", 10.30,   
              "ARGAFF",   "OMZ", 10.41,  
              "BATABY",    "EQ", 10.57,      
              "BATABY",    "EQ", 10.60,      
              "BATABY",    "EQ", 10.68,        
              "BATABY",   "OMZ",  9.21,       
              "BATABY",   "OMZ",  9.29,       
              "BATABY",   "OMZ",  9.67)
df %>%
  group_by(species) %>%
  t_test(N15~region)

像扫帚一样,Rstatix 返回一个 tibble