Непараметрический c тест для сравнения строк в разных фреймах данных в R - PullRequest
1 голос
/ 22 января 2020

Это мой первый пост здесь.

У меня есть 4 кадра данных, для которых я хотел бы сделать пошаговые непараметрические c тесты для каждой строки.

enter image description here

Например. Я хотел бы сравнить значения для каждой строки в кадре данных A со значениями для каждой строки в кадре данных B.

Мне понадобится непараметрический тест c, например. Уилкоксон или еще что-нибудь.

Я думал о создании новой колонки со срединным значением, но я уверен, что есть что-то лучше.

Не могли бы вы дать мне идею, как это сделать?

Заранее спасибо!

Редактировать: Вот мои воображаемые кадры данных.

Я хочу сравнить каждый кадр данных построчно например, проведите непараметрический тест c для Джона в кадрах данных A и B, затем для Доры и др. c.

A <- data.frame("A" = c("John","Dora","Robert","Jim"), 
                "A1" = c(8,1,10,5), 
                "A2"= c(9,1,1,4))
B <- data.frame("B" = c("John","Dora","Robert","Jim"), 
                "B1" = c(1,1,1,5), 
                "B2"= c(3,2,1,5), 
                "B3"=c(4,3,1,5), 
                "B4"=c(6,8,8,1))

1 Ответ

0 голосов
/ 22 января 2020

Я думаю, что вы ищете функцию wilcox.test (в пакете stats).

Решение 1: Использование for loop

в одну сторону сравнить каждую строку A с соответствующей строкой B (и извлечь значение p) - создать for loop, например:

pval = NULL
for(i in 1:nrow(A))
{
    vec_a = as.numeric(A[i,2:ncol(A)])
    vec_b = as.numeric(B[B$B == A$A[i],2:ncol(B)])

    p <- wilcox.test(vec_a,vec_b)
    pval = c(pval, p$p.value)
    print(p)
}

В конце вы получите вектор pval содержит значение для каждой строки.

pval
[1] 0.1333333 0.2188194 0.5838824 1.0000000

Решение 2. Использование tidyverse

Более элегантным решением является использование пакетов tidyverse (в частности dplyr и tidyr) собрать ваш фрейм данных в один и сравнить каждое имя по группе, передав формулу в функцию wilcox.test.

Сначала мы можем объединить ваши фреймы данных по их имени, используя функцию left_join из dplyr:

library(dplyr)
DF <- left_join(A,B, by = c("A"="B"))

       A A1 A2 B1 B2 B3 B4
1   John  8  9  1  3  4  6
2   Dora  1  1  1  2  3  8
3 Robert 10  1  1  1  1  8
4    Jim  5  4  5  5  5  1

Затем, используя пакеты dplyr и tidyr, вы можете изменить форму вашего фрейм данных в более длинном формате:

library(dplyr)
library(tidyr)
DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") 

# A tibble: 24 x 3
   A     var   values
   <fct> <chr>  <dbl>
 1 John  A1         8
 2 John  A2         9
 3 John  B1         1
 4 John  B2         3
 5 John  B3         4
 6 John  B4         6
 7 Dora  A1         1
 8 Dora  A2         1
 9 Dora  B1         1
10 Dora  B2         2
# … with 14 more rows

Мы создадим новый столбец «группа», который будет указывать A или B в зависимости от значений в столбце var:

DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") %>%
  mutate(group = gsub("\\d","",var))

# A tibble: 24 x 4
   A     var   values group
   <fct> <chr>  <dbl> <chr>
 1 John  A1         8 A    
 2 John  A2         9 A    
 3 John  B1         1 B    
 4 John  B2         3 B    
 5 John  B3         4 B    
 6 John  B4         6 B    
 7 Dora  A1         1 A    
 8 Dora  A2         1 A    
 9 Dora  B1         1 B    
10 Dora  B2         2 B    
# … with 14 more rows

Наконец, мы можно сгруппировать по A и суммировать данные, чтобы получить значение p функции wilcox.test при сравнении значений в каждой группе для каждого имени:

DF %>% pivot_longer(., -A, names_to = "var", values_to = "values") %>%
  mutate(group = gsub("\\d","",var)) %>%
  group_by(A) %>%
  summarise(Pval = wilcox.test(values~group)$p.value)

# A tibble: 4 x 2
  A       Pval
  <fct>  <dbl>
1 Dora   0.219
2 Jim    1    
3 John   0.133
4 Robert 0.584

Это выглядит длиннее (особенно потому, что я объясняю каждый шаг ) но в конце вы видите, что нам нужно меньше строк, чем первое решение.

Это отвечает на ваш вопрос?

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