首页 > 解决方案 > 如何使用 R 计算数据框中一列与单个语句中所有其他列的配对 t 检验

问题描述

我有一个包含大约 20 个不同数据列的数据框。第一列有两个选项:结果为真或假。

我想在第一列和其余列之间进行配对 t.test,总共进行 19 次测试,目的是对其他 19 列预测真实值的能力进行排名。

我希望有一种方法可以在本质上循环遍历列,同时始终保持第一列。

这将遍历从左到右的列,但不会在增加第二列的同时始终保持第一列 (a) 的静态。如A&B、B&C、C&D等。

代码:

tests = lapply(seq(1,(length(df)-1)),function(x){t.test(df[,x],df[,x+1])}) 

相反,我想要的是:A&B、A&C、A&D 等。

标签: rdataframe

解决方案


我想知道您是否真的要进行非配对t 检验。我这么说的原因是您将第一列描述为 TRUE 或 FALSE,然后说您的目标是查看其他列可以如何预测 TRUE 值。或者换句话说,其他 19 列的均值在 TRUE 组和 FALSE 组之间是否存在显着差异。如果您真的想进行配对 t 检验,那么如上所述,您的数据格式不完全正确。除非您想比较 x2 和 x3 或 x3 和 x4 等,否则您将使用以下内容:

t.test(df$x2, df$x3, paired=TRUE)

使用公式方法实现以第一列作为组变量对第二列执行非配对t 检验。例如,要比较 TRUE 和 FALSE 组之间第二个变量的均值,您可以执行以下操作:

t.test(x1 ~ group, data=df)

这是一个未配对的两样本 t 检验。由于稍后将变得明显的原因,它也可以稍微不同地完成。

t.test(df$x1 ~ df$group)
t.test(df[,2] ~ df[,1])

后一个版本允许您使用上述lapply功能执行重复测试。

tests <- lapply(2:20, function(x) t.test(df[,x] ~ df[,1]))

这将返回一个未命名的列表,可以使用数据框的名称对其进行命名。

names(tests) <- names(df)[2:20]
tests[1]

$x1

    Welch Two Sample t-test

data:  df[, x] by df[, 1]
t = -0.83536, df = 94.695, p-value = 0.4056
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5.339658  2.176944
sample estimates:
mean in group FALSE  mean in group TRUE 
           48.46547            50.04683

你也可以使用broom包来整理它。

lapply(tests,  broom::tidy)

$x1
# A tibble: 1 x 10
  estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high method      alternative
     <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>     <dbl> <chr>       <chr>      
1    -1.58      48.5      50.0    -0.835   0.406      94.7    -5.34      2.18 Welch Two ~ two.sided  

dplyr版本将使用函数do而不是lapply,但首先需要将数据框整理成长格式。

library(dplyr)
library(tidyr)

df %>% pivot_longer(cols=starts_with("x")) %>%
  group_by(name) %>%
  do(tidy(t.test(.$value ~ .$group)))

# A tibble: 19 x 11
# Groups:   name [19]
   name  estimate estimate1 estimate2 statistic p.value parameter conf.low conf.high
   <chr>    <dbl>     <dbl>     <dbl>     <dbl>   <dbl>     <dbl>    <dbl>     <dbl>
 1 x1     -1.58        48.5      50.0   -0.835   0.406       94.7   -5.34      2.18 
 2 x10    -0.377       49.3      49.6   -0.194   0.847       95.1   -4.24      3.49 
 3 x11     4.49        53.1      48.6    2.08    0.0400      97.8    0.209     8.77 
 4 x12    -1.05        51.1      52.2   -0.450   0.654       88.9   -5.70      3.59 
 5 x13    -0.743       49.4      50.1   -0.360   0.720       96.8   -4.84      3.35 
 6 x14     0.908       51.5      50.6    0.487   0.627       93.3   -2.79      4.61 

资料

set.seed(123)
n <- 100; m=19  # number of subjects (rows) and number of "x" columns
X <- data.frame(matrix(rnorm(n*m, mean=50, sd=10), byrow=TRUE, nc=m))
colnames(X) <- paste0("x", 1:19)
df <- data.frame(group=sample(c(TRUE, FALSE), size=n, replace=TRUE), X)
str(df)

'data.frame':   100 obs. of  20 variables:
 $ group: logi  FALSE FALSE FALSE FALSE TRUE FALSE ...
 $ x1   : num  44.4 45.3 46.9 55.8 47.2 ...
 $ x2   : num  47.7 39.3 46.2 51.2 37.8 ...
 $ x3   : num  65.6 47.8 43.1 52.2 51.8 ...
 $ x4   : num  50.7 39.7 47.9 53.8 48.6 ...
 $ x5   : num  51.3 42.7 37.3 45 50.1 ...
 $ x6   : num  67.2 43.7 71.7 46.7 53.9 ...

推荐阅读