Непарный t-тест с использованием данных в одном столбце - PullRequest
0 голосов
/ 20 января 2020

Я хочу сделать непарный t-тест, чтобы проверить, отличаются ли значения между сайтами в каждой типе категории.

Так что мой вопрос в том, в типах (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-теста для проверки:

  1. Если значение A Тип AB , отличается между сайтом A и сайтом B
  2. Если значение B Тип AB, отличается между сайтом A и сайтом B
  3. Если значение A Type CD, отличается между сайтом A и сайтом B
  4. Если значение типа CD 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-значение здесь дает мне разницу между значением A и значением B.

Я ищу, например: разницу между сайтом A и сайтом B значения A в типе CD.

Так что, если я правильно думаю, выходные данные t-теста должны иметь столбец для типа, значения A и значения B. Тогда значения p предназначены для различий между сайтами.

Аналогично этому:

type  valueA  valueB
AB     0.365   0.784
CD     0.492   0.417

Имеет ли это смысл?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Мы можем сделать 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

Если мы хотим сравнить столбцы «value» между «AB» и «CD»

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
1 голос
/ 20 января 2020

Я думаю, я понимаю, что вы просите. Посмотрите, работает ли это для вас:

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

Здесь мы go от широких до длинных, разделим фрейм данных по сайтам. Переименуйте интересующие вас значения, чтобы включить сайт, повторно присоедините фрейм данных, а затем запустите сгруппированный t.test по типу и сайту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...