【发布时间】:2019-03-08 18:12:32
【问题描述】:
假设这样的数据结构:
ID testA_wave1 testA_wave2 testA_wave3 testB_wave1 testB_wave2 testB_wave3
1 1 3 2 3 6 5 3
2 2 4 4 4 3 6 6
3 3 10 2 1 4 4 4
4 4 5 3 12 2 7 4
5 5 5 3 9 2 4 2
6 6 10 0 2 6 6 5
7 7 6 8 4 6 8 3
8 8 1 5 4 5 6 0
9 9 3 2 7 8 4 4
10 10 4 9 5 11 8 8
我想要实现的是分别为每个测试计算配对 t 检验(在这种情况下意味着 testA 和 testB,但在现实生活中我有更多的测试)。我想这样做,我将给定测试的第一波与同一测试的所有其他后续波进行比较(在 testA 的情况下是 testA_wave1 与 testA_wave2 和 testA_wave1 与 testA_wave3)。
这样,我就可以实现了:
df %>%
gather(variable, value, -ID) %>%
mutate(wave_ID = paste0("wave", parse_number(variable)),
variable = ifelse(grepl("testA", variable), "testA",
ifelse(grepl("testB", variable), "testB", NA_character_))) %>%
group_by(wave_ID, variable) %>%
summarise(value = list(value)) %>%
spread(wave_ID, value) %>%
group_by(variable) %>%
mutate(p_value_w1w2 = t.test(unlist(wave1), unlist(wave2), paired = TRUE)$p.value,
p_value_w1w3 = t.test(unlist(wave1), unlist(wave3), paired = TRUE)$p.value) %>%
select(variable, matches("(p_value)"))
variable p_value_w1w2 p_value_w1w3
<chr> <dbl> <dbl>
1 testA 0.664 0.921
2 testB 0.146 0.418
但是,我希望看到不同/更优雅的解决方案,它们会产生类似的结果。我主要在寻找dplyr/tidyverse 的解决方案,但如果有完全不同的方法来实现它,我不反对。
样本数据:
set.seed(123)
df <- data.frame(ID = 1:20,
testA_wave1 = round(rnorm(20, 5, 3), 0),
testA_wave2 = round(rnorm(20, 5, 3), 0),
testA_wave3 = round(rnorm(20, 5, 3), 0),
testB_wave1 = round(rnorm(20, 5, 3), 0),
testB_wave2 = round(rnorm(20, 5, 3), 0),
testB_wave3 = round(rnorm(20, 5, 3), 0))
【问题讨论】:
-
testA_wave2和testA_wave3怎么样? -
@JasonAizkalns 我只对第一波与所有后续波的比较感兴趣。因此,不需要 testA_wave2 与 testA_wave3。
-
这更像是一个统计问题,但与编程相关 - 您正在运行大量配对 t 检验,所以您会针对多重比较进行调整吗?您可以进行更有效的纵向分析吗?
-
@Mike 我知道你的意思,但在这种情况下不需要更正。
-
关于@Mike 的评论(对于登陆这里但没有关注它的任何人):stats.stackexchange.com/questions/88065/…