【问题标题】:Un-paired t-test using data within one column使用一列中的数据进行非配对 t 检验
【发布时间】:2020-01-20 18:29:33
【问题描述】:

我想进行非配对 t 检验,以检查每个 type 类别中是否在站点之间不同。

所以我的问题是,在类型内(AB 或 CD),(valueA 或 valueB)在站点之间(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 检验来检查:

  1. 如果 valueA 类型 AB,则站点 A 与站点 B 之间的差异
  2. 如果 valueB 类型 AB,则站点 A 与站点 B 之间的差异
  3. 如果 valueA 类型为 CD,则站点 A 与站点 B 之间的差异
  4. 如果 valueB 类型为 CD,则站点 A 与站点 B 之间的差异

为了运行非配对 t 检验,我认为我需要重新排列我的数据,以便类型 AB 和类型 CB 以及站点 A 和站点 B 都是一列(而不是在类型或站点列中)。

编辑:

在 cmets 中使用建议的代码:

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

这有意义吗?

【问题讨论】:

    标签: r reshape spread t-test


    【解决方案1】:

    我们可以做一个group_by 'site', 'type' 并应用t.test

    library(dplyr)
    out <- dat %>% 
             group_by(site, type) %>% 
             summarise(pval = t.test(valueA, valueB)$p.value)
    

    默认情况下,paired = FALSE in 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
    

    【讨论】:

    • 谢谢@akrun,我已经编辑了我的问题来问另一个问题!
    • @jl748795 所以,您只想将reshape 设为“宽”格式
    • 谢谢。 ** mutate(site = str_c('value', ... ** ) 的代码部分只是在列名中的站点 A 或站点 B 前面添加单词“值”。如果我改变世界值到'vvv',它在列名中显示为'vvvA'和'vvvB'。所以它没有给我类型,valueA和valueB的列,它仍然给我类型,站点A和站点B的列.
    【解决方案2】:

    我想我明白你的要求了。看看这是否适合你:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多