Редактировать:
Как я обнаружил позже где-то еще, тест 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