Примените критерий Chi-Squared в R для более чем 5 переменных и найдите значения p - PullRequest
0 голосов
/ 14 марта 2020

Я новичок в тесте Chi-Squared. У меня есть база данных с большим количеством категориальных переменных.

Пример базы данных с несколькими переменными:

enter image description here

Я хочу применить CHi - Квадратный тест в R и хотите найти p-значения всех этих категориальных переменных. Исходя из этого, я буду ранжировать свои переменные и удалять наименее важные переменные.

Можете ли вы посоветовать мне, как я могу найти p-значения всех вышеуказанных переменных в R.

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

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Сначала просмотрите все детали здесь: выполняя тест хи-квадрат для нескольких переменных и извлекая соответствующее значение p в R Затем см. Аналогичный код решения ниже:

> # Assuming your dataframe is something like: 
> x1 <- sample(1:7,5,replace = F)
> x2 <- sample(2:7,5,replace = T)
> x3 <- sample(1:6,5,replace = T)
> x4 <- sample(3:8,5,replace = T)
> y <- sample(1:100,5,replace = F)
> df <- data.frame(cbind(x1,x2,x3,x4,y))
> ?sample
> mapply(function(x, y) chisq.test(x, y)$p.value, df[, -5], MoreArgs=list(df[,5]))
       x1        x2        x3        x4 
0.2202206 0.2202206 0.2872975 0.2414365 
# Note this is just a schema - you will need to adapt & align statistical nuances...
0 голосов
/ 14 марта 2020

Вы можете использовать lapply для выполнения повторяющихся задач, здесь тест хи-квадрат для нескольких столбцов фрейма данных с первым столбцом.

CHIS <- lapply(data[,-1], function(x) chisq.test(data[,1], x)); CHIS

Результатом является список, который может быть комбинируется в более удобном для просмотра формате, используя do.call и rbind.

do.call(rbind, CHIS)[,c(1,3)]
   statistic    parameter p.value  
X1 0.08680556   1         0.7682782
X2 0.9695384    1         0.3247953
X3 9.464545e-31 1         1        
X4 0.9695384    1         0.3247953
X5 0.78125      1         0.3767591

Или, возможно, используя функцию tidy из метла .

library(broom)

do.call(rbind, lapply(CHIS, tidy))

# A tibble: 5 x 4
  statistic p.value parameter method                                                      
*     <dbl>   <dbl>     <int> <chr>                                                       
1  8.68e- 2   0.768         1 Pearson's Chi-squared test with Yates' continuity correction
2  9.70e- 1   0.325         1 Pearson's Chi-squared test with Yates' continuity correction
3  9.46e-31   1.00          1 Pearson's Chi-squared test with Yates' continuity correction
4  9.70e- 1   0.325         1 Pearson's Chi-squared test with Yates' continuity correction
5  7.81e- 1   0.377         1 Pearson's Chi-squared test with Yates' continuity correction

Но, к сожалению, имена исчезают. Функция rbindlist из data.table имеет необязательный аргумент idcol для сохранения имен из исходного списка.

library(data.table)
rbindlist(lapply(CHIS, tidy), idcol=TRUE)

   .id    statistic   p.value parameter
1:  X1 8.680556e-02 0.7682782         1
2:  X2 9.695384e-01 0.3247953         1
3:  X3 9.464545e-31 1.0000000         1
4:  X4 9.695384e-01 0.3247953         1
5:  X5 7.812500e-01 0.3767591         1

Воспроизводимый пример :

nvars=5; nrows=50
set.seed(123)
X <- data.frame(matrix(sample(c(0,1), size=nrows*nvars, replace=TRUE), nc=nvars))
data <- data.frame(AppCategory=c(rep("Benign", 20), rep("Malware", 30)), X)
str(data)

'data.frame':   50 obs. of  6 variables:
 $ AppCategory: Factor w/ 2 levels "Benign","Malware": 1 1 1 1 1 1 1 1 1 1 ...
 $ X1         : num  0 0 0 1 0 1 1 1 0 0 ...
 $ X2         : num  1 0 0 0 0 1 1 0 1 0 ...
 $ X3         : num  0 1 1 0 1 1 0 0 0 1 ...
 $ X4         : num  0 1 0 1 0 0 0 0 0 0 ...
 $ X5         : num  1 1 1 0 1 1 1 0 1 1 ...
...