Примените критерий хи-квадрат в R для более чем 5 переменных и найдите p-значения

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

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

введите здесь описание изображения

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

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

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


person Affan    schedule 14.03.2020    source источник
comment
Я не уверен, что тест хи-квадрат подходит для ваших данных. Можете ли вы уточнить, какова ваша гипотеза, которую вы пытаетесь проверить? Также, прежде чем задавать новый вопрос, возможно, вам следует просмотреть это: stackoverflow.com/help/no-one-answers   -  person Dave2e    schedule 14.03.2020
comment
У меня около 90 категориальных переменных, и я хочу удалить наименее важные переменные, которые не имеют значения в наборе данных.   -  person Affan    schedule 14.03.2020


Ответы (2)


Вы можете использовать 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 из broom.

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 ...
person Edward    schedule 14.03.2020
comment
Большое спасибо за Вашу помощь. Есть ли способ отсортировать их на основе p-значений, потому что у меня есть 90 переменных. do.call(rbind,CHIS)[,c(1,3)] - person Affan; 14.03.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...
person aiatay7n    schedule 14.03.2020