Многомерный статистический анализ с использованием R. Как увидеть значительную разницу, когда строки и столбцы являются группами (Упорядоченные по категориям) - PullRequest
1 голос
/ 19 апреля 2020

Мои данные выглядят следующим образом Где DFD - мой фрейм данных.

DFD
  Names  BP  jobcode bp_Category
1     A 100   Doctor      low_BP
2     B 150   Doctor   Medium_BP
3     C 200 Engineer     High_BP
4     D 110 Engineer      low_BP
5     E 160  Student   Medium_BP

Вот как я получаю процент от каждого кода задания, страдающего от низкого, высокого и среднего АД, следующим образом.

tabLE<-table(DFD$bp_Category,DFD$jobcode)
> prop.table(tabLE,2)*100

            Doctor Engineer Student
  low_BP        50       50       0
  Medium_BP     50        0     100
  High_BP        0       50       0

Я хочу спросить, как и с помощью какого статистического теста я вижу значительную разницу между тремя кодами работы соответственно для всех трех bp_categories. Например, я хочу посмотреть, есть ли у инженеров значительно более высокий процент Medium_BP среди докторов и студентов или нет?

Data 

Names<-c("A","B","C","D","E")
BP<-c(100,150,200,110,160)
jobcode<-c("Doctor","Doctor","Engineer","Engineer","Student")
jobcode<-ordered(jobcode)
DFD<-data.frame(Names,BP,jobcode)
DFD$bp_Category[DFD$BP<140]<-"low_BP"
DFD$bp_Category[DFD$BP<170 & DFD$BP>140]<-"Medium_BP"
DFD$bp_Category[DFD$BP<201 & DFD$BP>170]<-"High_BP"
DFD$bp_Category<-ordered(DFD$bp_Category, levels = c("low_BP","Medium_BP","High_BP"))
tabDFD <- with(DFD, table(DFD$bp_Category,DFD$jobcode))
tabLE<-table(DFD$bp_Category,DFD$jobcode)
prop.table(tabLE,2)*100

1 Ответ

1 голос
/ 19 апреля 2020

Используя смоделированный набор данных, где пропорции более или менее равны среди БП и профессий:

set.seed(111)
DFD = data.frame(jobcode = sample(c("Doctor","Engineer","Student"),10000,replace=TRUE),
bp_Category = sample(c("low_BP","Medium_BP","High_BP"),10000,replace=TRUE)
)

Поскольку это моделируется при нулевом значении, вы видите, что это примерно 33% для всех:

tabDFD <- with(DFD, table(DFD$bp_Category,DFD$jobcode))
tabLE<-table(DFD$bp_Category,DFD$jobcode)
prop.table(tabLE,2)*100

              Doctor Engineer  Student
  High_BP   32.81156 33.89058 32.96930
  low_BP    33.68453 32.73556 33.82527
  Medium_BP 33.50391 33.37386 33.20543

Мы можем выполнить тест хи-квадрат для каждой строки, но нам нужно знать ожидаемые пропорции доктора, инженера, студента, поэтому мы получим следующее:

probs = colSums(tabLE)/sum(tabLE)

И затем для каждого Строка, мы проверяем, насколько каждая клетка отклоняется от того, что мы ожидаем:

library(broom)
library(purrr)

results = split(as.matrix(tabLE),rownames(tabLE)) %>% 
map_dfr(~tidy(chisq.test(.x,p=probs)),.id="BP") 

 results
# A tibble: 3 x 5
  BP        statistic p.value parameter method                                  
  <chr>         <dbl>   <dbl>     <dbl> <chr>                                   
1 High_BP      0.676    0.713         2 Chi-squared test for given probabilities
2 low_BP       0.697    0.706         2 Chi-squared test for given probabilities
3 Medium_BP    0.0451   0.978         2 Chi-squared test for given probabilities
...