#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));
или PMFplot(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
Если вы обнаружите какую-либо ошибку, пожалуйста, дайте мне знать. Спасибо