r - 如何使用 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 等。
解决方案
我想知道您是否真的要进行非配对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 ...
推荐阅读
- python - 如何使用来自未绑定队列的消息进行多处理
- sql-server - SQL Server 触发器自动填充整个列
- android - 安装 React Navigation 和手势处理程序后出错
- html - 无法在导航栏中查看切换按钮
- sql - 在 SQL 查询结果中显示非 iso 字符
- php - PHP中文件上传到nextcloud的示例
- scala - scala "Illegal start of simple expression" 用于理解 if
- c++ - C++中的函数声明后不需要分号(';')吗?
- r - 一次变异和替换几列
- javascript - 如何根据对象 id 和 div id 显示按钮