Использование prop.test для сгруппированных переменных в фрейме данных - PullRequest
1 голос
/ 16 июня 2020

У меня есть фрейм данных ниже, и я пытаюсь вычислить, есть ли значительная разница в пропорциях между группами внутри каждой категории. Например, категория A группа 1 против 2, 1 против 3 и 2 против 3.

Есть ли способ вычислить и добавить p-значения в фрейм данных в виде новых столбцов без необходимости вычислять их и добавлять вручную по одной строке за раз?

Или есть способ их вычислить и сохранить в отдельном фрейме данных?

          Group   Category number min total  Proportion
1          1         A      6  2.5    33 0.1818182
2          1         B      4  3.2    33 0.1212121
3          1         C     16  3.2    33 0.4848485
4          1         D      7  3.1    33 0.2121212
5          2         A     22  6.4   133 0.1654135
6          2         B     17  6.7   133 0.1278195
7          2         C     56  6.0   133 0.4210526
8          2         D     38  6.4   133 0.2857143
9          3         A      3 10.0    22 0.1363636
10         3         B      3  9.7    22 0.1363636
11         3         C      9 10.6    22 0.4090909
12         3         D      7  9.9    22 0.3181818

1 Ответ

0 голосов
/ 17 июня 2020

Решение довольно сложное, хотя и выглядит легкой задачей. Вот решение с использованием пакета purrr в качестве основного инструмента.

Давайте импортируем данные:

data <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
 3L, 3L), Category = c("B", "C", "D", "A", "B", "C", "D", "A", 
 "B", "C", "D"), number = c(4L, 16L, 7L, 22L, 17L, 56L, 38L, 3L, 
 3L, 9L, 7L), min = c(3.2, 3.2, 3.1, 6.4, 6.7, 6, 6.4, 10, 9.7, 
 10.6, 9.9), total = c(33L, 33L, 33L, 133L, 133L, 133L, 133L, 
 22L, 22L, 22L, 22L), Proportion = c(0.1212121, 0.4848485, 0.2121212, 
 0.1654135, 0.1278195, 0.4210526, 0.2857143, 0.1363636, 0.1363636, 
 0.4090909, 0.3181818)), row.names = 2:12, class = "data.frame")

и необходимые пакеты:

library(dplyr) # mutate, group_by and rowwise functions
library(tidyr) # nest
library(purrr) # map
library(combinat) # combn

Мы создадим tibble объект foo, который разделяет исходный набор данных на группы. Это позволяет нам отображать функции на группы.

foo <- foo %>% mutate(tab = map(data, combFun)) 

Теперь мы определяем собственную функцию combPval, которая 1) создает data.frame комбинаций факторов (combTab), 2) создает data.frame tab1, в котором хранятся соответствующие столбцы для prop.test. Эти data.frames объединяются на последующих этапах для создания data.frame data. Затем prop.test применяется способом rowwise.

combPval <- function(group){
 combTab <- combn(unique(group$Category), 2) %>% t() %>% data.frame()
 tab1 <- group %>% select(Category, number, total)
 combTab
 temp <- merge(y=combTab, x=tab1, by.y="X2", by.x="Category" ) 
 data <- merge(y=temp, x=tab1, by.y="X1", by.x="Category")

 data <- data %>% 
  rowwise() %>% 
  mutate(
   pval = prop.test(x=c(number.x, number.y), n=c(total.x, total.y))$p.val
  )

 data
}

Функция combPval применяется следующим образом:

foo <- foo %>% mutate(results = map(data, combPval))

Результаты для первой группы могут быть получены:

 foo$results[[1]]

 # A tibble: 3 x 7
 # Rowwise: 
   Category number.x total.x Category.y number.y total.y    pval
   <chr>       <int>   <int> <chr>         <int>   <int>   <dbl>
 1 B               4      33 C                16      33 0.00322
 2 B               4      33 D                 7      33 0.509  
 3 C              16      33 D                 7      33 0.0388 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...