使用一列内数据的非配对 t 检验
Un-paired t-test using data within one column
我想做一个未配对的 t 检验来检查 值 在每个 类型 站点之间 是否不同 =52=]类别。
所以我的问题是,在类型(AB 或 CD)中,值(值 A 或值 B)是否不同 站点之间(A 或 B)?
这是我的数据示例:
dat <- data.frame(
"site" = c("A","B","B","A","A","B","B","A"),
"type" = c("AB","CD"),
"valueA" = c(13,-10,-5,18,-14,12,-17,19),
"valueB" = c(-3,20,15,-16,12,15,-11,14)
)
dat
site type valueA valueB
A AB 13 -3
B CD -10 20
B AB -5 15
A CD 18 -16
A AB -14 12
B CD 12 15
B AB -17 -11
A CD 19 14
我正在尝试进行四个 未配对 t 检验来检查:
- 如果 valueA 类型为 AB,站点 A 与站点 B 之间存在差异
- 如果 valueB 类型为 AB,站点 A 与站点 B 之间存在差异
- 如果 valueA 类型为 CD,则站点 A 与站点 B 之间存在差异
- 如果 valueB 类型为 CD,则站点 A 与站点 B 之间存在差异
为了 运行 未配对的 t 检验,我认为我需要重新安排我的数据,以便类型 AB 和类型 CB 以及站点 A 和站点 B 都是一列(而不是在类型或网站栏中)。
编辑:
使用评论中建议的代码:
library(dplyr)
d %>%
group_by(site, type) %>%
summarise(pval = t.test(valueA, valueB)$p.value)
输出是这样的:
site type pval
A AB 0.784
A CD 0.417
B AB 0.492
B CD 0.365
据我了解,这里的 p 值给出了 valueA 和 valueB 之间的差异。
我正在寻找,例如:
类型CD中valueA的站点A和站点B的区别。
因此,如果我的想法是正确的,t 检验的输出应该有一列用于类型、值 A 和值 B。然后 p 值表示站点之间的差异。
与此类似:
type valueA valueB
AB 0.365 0.784
CD 0.492 0.417
这有意义吗?
我们可以做一个 group_by
'site', 'type' 并应用 t.test
library(dplyr)
out <- dat %>%
group_by(site, type) %>%
summarise(pval = t.test(valueA, valueB)$p.value)
默认情况下,paired = FALSE
在 t.test
上面的输出可以用 pivot_wider
重塑为 'wide' 格式
library(stringr)
library(tidyr)
out %>%
ungroup %>%
mutate(site = str_c('value', site)) %>%
pivot_wider(names_from = site, values_from = pval)
# A tibble: 2 x 3
# type valueA valueB
# <fct> <dbl> <dbl>
#1 AB 0.784 0.492
#2 CD 0.417 0.365
如果我们要比较 'AB' 和 'CD'
之间的 'value' 列
dat %>%
group_by(site) %>%
summarise_at(vars(starts_with('value')),
~ t.test(.[type == 'AB'], .[type == 'CD'])$p.value)
# A tibble: 2 x 3
# site valueA valueB
# <fct> <dbl> <dbl>
#1 A 0.393 0.784
#2 B 0.464 0.439
我想我明白你的要求了。看看这是否适合你:
library(tidyverse)
dat %>%
pivot_longer(cols = c(valueA, valueB), names_to = "name", values_to = "val") %>%
split(.$site) %>%
map(., ~rename(.x, !!sym(paste0(.x$site[[1]], "val")) := val) %>%
select(-site)) %>%
reduce(full_join, by = c("type", "name")) %>%
group_by(type, name) %>%
summarise(p.val = t.test(Aval, Bval)$p.value) %>%
pivot_wider(id_cols = type, names_from = name, values_from = p.val)
#> # A tibble: 2 x 3
#> # Groups: type [2]
#> type valueA valueB
#> <fct> <dbl> <dbl>
#> 1 AB 0.284 0.785
#> 2 CD 0.0703 0.121
这里我们从宽到长,按站点拆分数据框。重命名感兴趣的值以包括站点,重新加入数据框,然后 运行 按类型和站点分组 t.test。
我想做一个未配对的 t 检验来检查 值 在每个 类型 站点之间 是否不同 =52=]类别。
所以我的问题是,在类型(AB 或 CD)中,值(值 A 或值 B)是否不同 站点之间(A 或 B)?
这是我的数据示例:
dat <- data.frame(
"site" = c("A","B","B","A","A","B","B","A"),
"type" = c("AB","CD"),
"valueA" = c(13,-10,-5,18,-14,12,-17,19),
"valueB" = c(-3,20,15,-16,12,15,-11,14)
)
dat
site type valueA valueB
A AB 13 -3
B CD -10 20
B AB -5 15
A CD 18 -16
A AB -14 12
B CD 12 15
B AB -17 -11
A CD 19 14
我正在尝试进行四个 未配对 t 检验来检查:
- 如果 valueA 类型为 AB,站点 A 与站点 B 之间存在差异
- 如果 valueB 类型为 AB,站点 A 与站点 B 之间存在差异
- 如果 valueA 类型为 CD,则站点 A 与站点 B 之间存在差异
- 如果 valueB 类型为 CD,则站点 A 与站点 B 之间存在差异
为了 运行 未配对的 t 检验,我认为我需要重新安排我的数据,以便类型 AB 和类型 CB 以及站点 A 和站点 B 都是一列(而不是在类型或网站栏中)。
编辑:
使用评论中建议的代码:
library(dplyr)
d %>%
group_by(site, type) %>%
summarise(pval = t.test(valueA, valueB)$p.value)
输出是这样的:
site type pval
A AB 0.784
A CD 0.417
B AB 0.492
B CD 0.365
据我了解,这里的 p 值给出了 valueA 和 valueB 之间的差异。
我正在寻找,例如: 类型CD中valueA的站点A和站点B的区别。
因此,如果我的想法是正确的,t 检验的输出应该有一列用于类型、值 A 和值 B。然后 p 值表示站点之间的差异。
与此类似:
type valueA valueB
AB 0.365 0.784
CD 0.492 0.417
这有意义吗?
我们可以做一个 group_by
'site', 'type' 并应用 t.test
library(dplyr)
out <- dat %>%
group_by(site, type) %>%
summarise(pval = t.test(valueA, valueB)$p.value)
默认情况下,paired = FALSE
在 t.test
上面的输出可以用 pivot_wider
library(stringr)
library(tidyr)
out %>%
ungroup %>%
mutate(site = str_c('value', site)) %>%
pivot_wider(names_from = site, values_from = pval)
# A tibble: 2 x 3
# type valueA valueB
# <fct> <dbl> <dbl>
#1 AB 0.784 0.492
#2 CD 0.417 0.365
如果我们要比较 'AB' 和 'CD'
之间的 'value' 列dat %>%
group_by(site) %>%
summarise_at(vars(starts_with('value')),
~ t.test(.[type == 'AB'], .[type == 'CD'])$p.value)
# A tibble: 2 x 3
# site valueA valueB
# <fct> <dbl> <dbl>
#1 A 0.393 0.784
#2 B 0.464 0.439
我想我明白你的要求了。看看这是否适合你:
library(tidyverse)
dat %>%
pivot_longer(cols = c(valueA, valueB), names_to = "name", values_to = "val") %>%
split(.$site) %>%
map(., ~rename(.x, !!sym(paste0(.x$site[[1]], "val")) := val) %>%
select(-site)) %>%
reduce(full_join, by = c("type", "name")) %>%
group_by(type, name) %>%
summarise(p.val = t.test(Aval, Bval)$p.value) %>%
pivot_wider(id_cols = type, names_from = name, values_from = p.val)
#> # A tibble: 2 x 3
#> # Groups: type [2]
#> type valueA valueB
#> <fct> <dbl> <dbl>
#> 1 AB 0.284 0.785
#> 2 CD 0.0703 0.121
这里我们从宽到长,按站点拆分数据框。重命名感兴趣的值以包括站点,重新加入数据框,然后 运行 按类型和站点分组 t.test。