R - критерий независимости квадрата хи с теми же вероятностями для классов - PullRequest
0 голосов
/ 05 декабря 2018

Редактировать:

Как я обнаружил позже где-то еще, тест Chi², вероятно, не подходит для моих данных здесь или скорее не проверяет то, что я хочу выяснить.Поэтому я провел обобщенную линейную модель (glm) с распределением Пуассона на моих данных, что сработало довольно хорошо.Так что имейте это в виду ...

.

После консультации с различными веб-сайтами по этой проблеме (например, , , , или это ) и, конечно же, официальная документация функции chisq.test, я до сих пор не могу найти решение своей проблемы.

Что я хочу:

Я хочу провести проверку независимости данных Chi² с помощью функции chisq.test в R.Мои данные состоят из 4 видов эпифитов, обнаруженных на 4 видах деревьев-хозяев (это означает: растения 4 видов, растущие на этих 4 видах деревьев).Теперь я хочу выяснить, равномерно ли распределены эпифиты между этими деревьями или, возможно, один вид деревьев имеет тенденцию принимать больше особей эпифитов, чем другие.Стандартный тест Chi² я могу провести довольно легко (см. Ниже).Но тогда это также проверило бы, были ли виды эпифитов равномерно распределены, что я не хочу проверять.Итак, как я могу представить различные вероятности для моей таблицы непредвиденных обстоятельств в функции cisq.test?А именно, я хочу, чтобы ожидаемая матрица соответствовала количеству особей эпифитов для каждого вида, в то же время ожидая, что они будут равномерно распределены между видами деревьев.Это звучит сложно, поэтому просто посмотрите на мои данные в качестве примера:

Пример данных:

(я отредактировал формат данных в соответствии с предложением @paoloeusebi)

Наблюдаемые данные:

obs_data = matrix(c(0,60,2,5,
                 0,25,3,5,
                 20,90,30,
                 10,1,4,3,0),
               nrow = 4, 
               dimnames = list(c("AS", "BU", "CL", "MB"),
                               c("CS", "GS", "TA", "WG")))

> obs_data
   CS GS TA WG
1    AS  0  0 20  1
2    BU 60 25 90  4
3    CL  2  3 30  3
4    MB  5  5 10  0

Ожидаемые данные:

Создание ожидаемых данных:

exp_data = matrix(rep(colSums(obs_data)/4,each = 4),
                  nrow = 4,
                  dimnames = list(c("AS", "BU", "CL", "MB"),
                                  c("CS", "GS", "TA", "WG")))

> exp_data
      CS   GS   TA WG
AS 16.75 8.25 37.5  2
BU 16.75 8.25 37.5  2
CL 16.75 8.25 37.5  2
MB 16.75 8.25 37.5  2

НО: Ожидаемые данные в соответствии с тестом Chi²:

> example_test = chisq.test(obs_data[,2:4])

Pearson's Chi-squared test

data:  obs_data[, 2:4]
X-squared = 31.99, df = 6, p-value = 1.639e-05

> example_test$expected
        CS    GS  TA
[1,]  5.36  2.64  12
[2,] 46.90 23.10 105
[3,]  9.38  4.62  21
[4,]  5.36  2.64  12

Вопрос

Итак, это даже правильный тест для того, что я хочу сделать?Может быть, мне стоит просто провести тест Chi² на соответствие качества с расплавленными / длинными данными?Но я не уверен, что это будет точно.

Решение, предложенное @paoloeusebi:

Я провел тест Chi² вручную, используя собственные ожидаемые данные вместо стандартных.Не знаю, нормально ли это для этого теста ...

> chi_result_own = sum((obs_data-exp_data)^2/exp_data)
[1] 304.8688

> pchisq(chi_result_own, df = 9, lower.tail = F)
[1] 2.419579e-60

И это, по-видимому, то же самое, что делать Chi-fit-fit-fit-fit-fit?Тем не менее, значение p намного ниже, и значения df отличаются, в то время как значение Chi² одинаково!?

long_data = obs_data %>% melt()
long_exp = exp_data %>% melt() %>% mutate(value = value/sum(value))

> chisq.test(long_data$value, p = long_exp$value)

Chi-squared test for given probabilities

data:  long_data$value
X-squared = 304.87, df = 15, p-value < 2.2e-16

1 Ответ

0 голосов
/ 05 декабря 2018

Лучше вводить данные в виде матрицы, а не в качестве фрейма данных.

obs_data <- matrix(c(0,60,2,5,
                     0,25,3,5,
                     20,90,30,
                     10,1,4,3,0),
                     nrow = 4, 
                     dimnames = list(c("AS", "BU", "CL", "MB"),
                                     c("CS", "GS", "TA", "WG")))
obs_data
       CS GS TA WG
   AS  0  0 20  1
   BU 60 25 90  4
   CL  2  3 30  3
   MB  5  5 10  0

В дальнейшем я использую то же исчисление тестовой функции хи-квадрат.Ожидаемое число ячеек - это матричное произведение предельных итогов (строк и столбцов), деленное на сумму.

sr <- rowSums(obs_data)
sc <- colSums(obs_data)
exp_data <- outer(sr, sc, "*")/sum(obs_data)

exp_data
        CS        GS        TA        WG
    AS  5.453488  2.686047  12.20930 0.6511628
    BU 46.484496 22.895349 104.06977 5.5503876
    CL  9.868217  4.860465  22.09302 1.1782946
    MB  5.193798  2.558140  11.62791 0.6201550

Это то, что необходимо для вычисления значения распределения Chi2

sum((obs_data-exp_data)^2/exp_data)
[1] 35.57418
pchisq(35.574, df=(nrow(obs_data)-1)*(ncol(obs_data)-1), lower.tail = F)
[1] 4.717395e-05

, котороето же самое рассчитывается функцией chisq.test

chisq.test(obs_data)
    Pearson's Chi-squared test

data:  obs_data
X-squared = 35.574, df = 9, p-value = 4.717e-05
...