Получение p-значения = 1 в тесте на соответствие критерию Хи-квадрат

Я пытаюсь провести тест на соответствие Пуассона для ряда наблюдений с использованием R. Я подсчитываю, сколько людей делали определенные вещи в минуту в течение 57 минут. У меня никогда не было наблюдений больше 13, и я получил следующие данные: (для случаев от 0 до 13+ человек):

observed = c(3/57, 4/57, 9/57, 7/57, 9/57, 8/57, 2/57, 3/57, 7/57, 2/57, 1/57, 0, 1/57, 1/57, 0)

это означает, что 3 раза я наблюдал 0 человек, 4 раза 1 человека, 9 раз 2 человека и так далее (последний 0 означает, что я никогда не видел 14 или более человек).

mn = 4.578947 
cases = c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
estimated = c()
for (i in cases)(estimated <- c(estimated, dpois(i, lambda = mn)))
estimated <- c(estimated, (1-ppois(13, lambda=mn)))

где mn — среднее значение, полученное из данных. Наконец, я бегу

 chisq.test(observed, p=estimated)

и я получаю:

 Chi-squared test for given probabilities

data:  observed
X-squared = 1.0182, df = 14, p-value = 1

Warning message:
In chisq.test(observed, p = estimated) :
  Chi-squared approximation may be incorrect

Я не очень хорошо разбираюсь в этой области (ни в статистике, ни в программировании на R), но у меня есть идея, что я не должен получать p-значение ровно 1,0. Что я делаю неправильно? (Кстати: мой код, скорее всего, не оптимален для того, что я пытаюсь сделать, но я почти не использую R, и сейчас это не является целью моей работы.)


person Andres Calvo    schedule 18.06.2018    source источник
comment
В дополнение к использованию данных подсчета для наблюдаемых частот вам необходимо иметь expected frequencies >= 5 для каждого бина/категории возникновения. объяснил в моем ответе ниже о том, как этого добиться.   -  person Mankind_008    schedule 18.06.2018


Ответы (2)


Ваши наблюдаемые значения должны быть количеством, а не пропорциями:

> chisq.test(observed*57, p=estimated)

    Chi-squared test for given probabilities

data:  observed * 57
X-squared = 58.036, df = 14, p-value = 2.585e-07

В файле справки R для chisq.test:

Если x — матрица с одной строкой или столбцом или если x — вектор, а y не задан, то выполняется проверка согласия (x рассматривается как одномерная таблица непредвиденных обстоятельств). Записи x должны быть целыми неотрицательными числами.

(выделено мной)

Вы можете проверить это с помощью примера кода в руководстве.

Как это должно быть сделано:

> x <- c(89,37,30,28,2)
> p <- c(0.40,0.20,0.20,0.19,0.01)
> chisq.test(x, p = p)

    Chi-squared test for given probabilities

data:  x
X-squared = 5.7947, df = 4, p-value = 0.215

Warning message:
In chisq.test(x, p = p) : Chi-squared approximation may be incorrect

И сделать ту же ошибку, что и вы:

> chisq.test(x/sum(x), p = p)

    Chi-squared test for given probabilities

data:  x/186
X-squared = 0.031154, df = 4, p-value = 0.9999

Warning message:
In chisq.test(x/186, p = p) : Chi-squared approximation may be incorrect
person QuishSwash    schedule 18.06.2018

Во-первых, чтобы провести тест на соответствие, наблюдаемые частоты и вероятности бинов< /em> обязательны.

 observed = c(3, 4, 9, 7, 9, 8, 2, 3, 7, 2, 1, 0, 1, 1, 0)       # keep counts

Вероятные вероятности:

 mn = 4.578947 
 prob = c()
 for (i in cases)     (prob <- c(prob, dpois(i, lambda = mn)))
 prob <- c(prob, (1-ppois(13, lambda=mn)))           # prob for 13 and plus category

Самое главное, Ожидаемая частота в ячейке/категории должна быть не менее 5. Chisq-test не подходит для небольших выборок. Вот почему вы получаете предупреждение (см. ожидаемую частоту для категорий 1,2 и 8–15) :

poisson_df <- data.frame(observed, prob)
poisson_df$expected = sum(poisson_df$observed)*poisson_df$prob

poisson_df

#   observed   prob          expected
#1         3   0.0102657004  0.58514492
#2         4   0.0470060980  2.67934759
#3         9   0.1076192157  6.13429530
#4         7   0.1642608950  9.36287101
#5         9   0.1880354831 10.71802253
#6         8   0.1722009022  9.81545143
#7         2   0.1314164674  7.49073864
#8         3   0.0859641485  4.89995646
#9         7   0.0492031600  2.80458012
#10        2   0.0250331846  1.42689152
#11        1   0.0114625626  0.65336607
#12        0   0.0047714970  0.27197533
#13        1   0.0018207026  0.10378005
#14        1   0.0006413001  0.03655410
#15        0   0.0002986829  0.01702492

chisq.test(x = poisson_df$observed, p= poisson_df$prob)

# Chi-squared test for given probabilities

# data:  observed
# X-squared = 58.036, df = 14, p-value = 2.585e-07

Warning message:
In chisq.test(x = poisson_df$observed, p= poisson_df$prob) :
Chi-squared approximation may be incorrect

Поэтому необходимо правильно создавать бины. Следует отметить, что Chisq-test чувствителен к биннингу, один из способов bin выглядит следующим образом:

cat_eq_3_less <- apply(poisson_df[1:3,], 2 , sum)        # sum of 1 to 3 categories
cat_eq_8_plus <- apply(poisson_df[8:15,], 2 , sum)       # sum 8 to 15 categories

corrected_df <- rbind(cat_eq_3_less, poisson_df[4:7,], cat_eq_8_plus)

 corrected_df
 #   observed     prob       expected
 #        16      0.1648910  9.398788
 #         7      0.1642609  9.362871
 #         9      0.1880355 10.718023
 #         8      0.1722009  9.815451
 #         2      0.1314165  7.490739
 #        15      0.1791952 10.214129

chisq.test(x = corrected_df$observed, p = corrected_df$prob)

Chi-squared test for given probabilities

data:  corrected_df$observed
X-squared = 12.111, df = 5, p-value = 0.0333
person Mankind_008    schedule 18.06.2018