Как создать график Q-Q с Пуассоном в качестве теоретического распределения

#r #plot #quantile #poisson

#r #график #квантиль #poisson

Вопрос:

Мне нужно создать Q-Q график, чтобы проверить, соответствуют ли мои наблюдаемые данные распределению Пуассона.

Вот мои данные.frame:

 df = read.table(text = 'Var1 Freq
 1975   10
 1976   12
 1977    9
 1978   14
 1979   14
 1980   11
 1981    8
 1982    7
 1983   10
 1984    8
 1985   12
 1986    9
 1987   10
 1988    9
 1989   10
 1990    9
 1991   11
 1992   12
 1993    9
 1994   10', header = TRUE)
 

df$Freq Меня интересует столбец, поскольку наблюдения представляют количество событий в год.

Я знаю, что мне нужно использовать qqplot функцию, а также функцию qpois для создания теоретических квантилей, но как?

Комментарии:

1. Ваши данные не распределены по Пуассону. Что заставляет вас думать, что это так?

2. Спасибо. Мне просто нужно статистическое подтверждение того, что вы сказали 🙂

3. Я не понимаю, что вы пытаетесь сделать. Ваши данные, очевидно , не являются пуассоновскими. Посмотрите, например, на CDF для lambda = 1 x <- seq(1975, 1994); plot(x, ppois(x, 1)); или PMF plot(x, rpois(x, 1)) .

4. У меня такое чувство, что может быть неправильное представление либо о распределении Пуассона , либо о назначении Q-Q графиков , либо и о том, и о другом.

5. @MauritsEvers, мне любопытно, почему вы думаете, что здесь есть заблуждение. Мне кажется разумным использовать график QQ для визуализации сравнения эмпирического и теоретического распределения.

Ответ №1:

Кроме того, fitdistrplus пакет может сделать это с гораздо меньшим количеством кода. Сравнивает эмпирическую и теоретическую плотность и CDF.

 library('fitdistrplus')
plot(fitdist(df$Freq,"pois"))
 

Вы можете получить свою лямбду и т. Д., А также проверить другие дистрибутивы. Не такой гибкий, как ggplot подход, но хорош для быстрой проверки.

Ответ №2:

ggplot2 имеет приятный интерфейс для этого. Вот график QQ с красной линией шага согласования. График QQ создается с использованием stat_qq и изменением distribution аргумента. Вам нужно будет указать lambda в dparams аргументе.

 ggplot(data = df,
       mapping = aes(sample = Freq))   
  stat_qq(distribution = stats::qpois,
          dparams = list(lambda = mean(df$Freq)))   
  geom_step(data = data.frame(x = 6:16,
                              Freq = 6:16),
            mapping = aes(x = x,
                          y = Freq),
            colour = "red",
            alpha = 0.5) 
 

Комментарии:

1. спасибо @Benjamin! Я только что опубликовал свой собственный ответ .. если вы можете взглянуть и сказать мне, заметили ли вы какую-либо ошибку.

Ответ №3:

вот мой возможный ответ:

 #calculate Frequencies
tbl = as.data.frame(table(df$Freq))

#create theoretical poisson distr
dist = dpois(1:7, lambda = mean(tbl$Freq))
dist = dist * 20              #make values in the same scale as tbl$Freq (20 = sum(tbl$Freq))
dist = as.data.frame(dist)
dist$Var1 = tbl$Var1

#qqplot
qqplot(dist$dist, tbl$Freq, xlab = 'Theoretical Quantiles', ylab = 'Empirical Quantiles',
       main = 'Q-Q plot Poisson', xlim = c(0,5), ylim = c(0,5))
abline(0,1) #create 45° line
 

Если вы обнаружите какую-либо ошибку, пожалуйста, дайте мне знать. Спасибо