Як намалювати встановлений графік та фактичний графік розподілу гамми в одному сюжеті?


10

Завантажте необхідний пакет.

library(ggplot2)
library(MASS)

Створіть 10 000 чисел, пристосованих до розподілу гами.

x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]

Намалюйте функцію густини ймовірностей, припускаючи, що ми не знаємо, до якого розподілу x підходив.

t1 <- as.data.frame(table(x))
names(t1) <- c("x","y")
t1 <- transform(t1,x=as.numeric(as.character(x)))
t1$y <- t1$y/sum(t1[,2])
ggplot() + 
  geom_point(data = t1,aes(x = x,y = y)) + 
  theme_classic()

pdf

З графіка ми можемо дізнатися, що розподіл x - це зовсім як гамма-розподіл, тому ми використовуємо fitdistr()в пакеті MASSдля отримання параметрів форми та швидкості розподілу гамми.

fitdistr(x,"gamma") 
##       output 
##       shape           rate    
##   2.0108224880   0.2011198260 
##  (0.0083543575) (0.0009483429)

Намалюйте фактичну точку (чорну крапку) та встановлений графік (червона лінія) на тому ж сюжеті, і ось питання, спочатку подивіться сюжет.

ggplot() + 
  geom_point(data = t1,aes(x = x,y = y)) +     
  geom_line(aes(x=t1[,1],y=dgamma(t1[,1],2,0.2)),color="red") + 
  theme_classic()

пристосований графік

У мене є два питання:

  1. Реальні параметри shape=2, rate=0.2і параметри , які я використовую функцію , fitdistr()щоб отримати це shape=2.01, rate=0.20. Ці два майже однакові, але чому пристосований графік добре не відповідає фактичній точці, у встановленому графіку повинно бути щось не так, або те, як я малюю пристосований графік та фактичні точки, зовсім неправильно, що мені робити ?

  2. Після того, як я отримую параметр моделі я встановити, яким чином я оцінити модель, що - щось на зразок RSS (залишкова сума квадратів) для лінійної моделі, або р-значення shapiro.test(), ks.test()і іншого тіста?

Я бідний у статистичних знаннях, чи не могли б ви мені допомогти?

ps: Я багато разів шукав пошук в Google, stackoverflow та CV, але не знайшов нічого, пов'язаного з цією проблемою


1
Я вперше поставив це запитання в stackoverflow, але здавалося, що це питання належить до CV, друг сказав, що я неправильно зрозумів функцію маси ймовірності та функцію густини ймовірностей, я не зміг її зрозуміти повністю, тому вибачте мене за відповідь на це питання ще раз у Резюме
Лінг Чжан

1
Ваш розрахунок щільності невірний. Простий спосіб розрахунку - це h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density).

@Pascal ви праві, я вирішив Q1, дякую!
Лінг Чжан

Дивіться відповідь нижче, densityфункція корисна.

Я розумію, ще раз дякую за редагування та вирішення мого питання
Ling Zhang

Відповіді:


11

питання 1

Те, як ви обчислюєте щільність вручну, здається неправильним. Немає необхідності округляти випадкові числа з розподілу гами. Як зазначав @Pascal, ви можете використовувати гістограму для побудови графіку щільності точок. У наведеному нижче прикладі я використовую функцію, densityщоб оцінити щільність і побудувати її як бали. Я представляю пристосування як з точки, так і з гістограмою:

library(ggplot2)
library(MASS)

# Generate gamma rvs

x <- rgamma(100000, shape = 2, rate = 0.2)

den <- density(x)

dat <- data.frame(x = den$x, y = den$y)

# Plot density as points

ggplot(data = dat, aes(x = x, y = y)) + 
  geom_point(size = 3) +
  theme_classic()

Гумальна щільність

# Fit parameters (to avoid errors, set lower bounds to zero)

fit.params <- fitdistr(x, "gamma", lower = c(0, 0))

# Plot using density points

ggplot(data = dat, aes(x = x,y = y)) + 
  geom_point(size = 3) +     
  geom_line(aes(x=dat$x, y=dgamma(dat$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

Гамма щільність підходить

# Plot using histograms

ggplot(data = dat) +
  geom_histogram(data = as.data.frame(x), aes(x=x, y=..density..)) +
  geom_line(aes(x=dat$x, y=dgamma(dat$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

Гістограма з пристосуванням

Ось рішення, яке надав @Pascal:

h <- hist(x, 1000, plot = FALSE)
t1 <- data.frame(x = h$mids, y = h$density)

ggplot(data = t1, aes(x = x, y = y)) + 
  geom_point(size = 3) +     
  geom_line(aes(x=t1$x, y=dgamma(t1$x,fit.params$estimate["shape"], fit.params$estimate["rate"])), color="red", size = 1) + 
  theme_classic()

Точки щільності гістограми

Питання 2

Для оцінки корисності я рекомендую пакет fitdistrplus. Ось як це можна використовувати для розміщення двох дистрибутивів та порівняння їх відповідностей графічно та чисельно. Команда gofstatвиводить декілька заходів, таких як AIC, BIC та деякі gof-статистики, такі як KS-Test тощо. Вони в основному використовуються для порівняння наборів різних розподілів (в даному випадку гамми та Weibull). Більше інформації можна знайти у моїй відповіді тут :

library(fitdistrplus)

x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
       38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
       42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
       49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
       45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
       36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
       38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)

fit.weibull <- fitdist(x, "weibull")
fit.gamma <- fitdist(x, "gamma", lower = c(0, 0))

# Compare fits 

graphically

par(mfrow = c(2, 2))
plot.legend <- c("Weibull", "Gamma")
denscomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
qqcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
cdfcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)
ppcomp(list(fit.weibull, fit.gamma), fitcol = c("red", "blue"), legendtext = plot.legend)

@NickCox справедливо радить, що QQ-Plot (верхня права панель) - найкращий єдиний графік для судження та порівняння підходів. Встановлені щільності важко порівняти. Я включаю й іншу графіку заради повноти.

Порівняйте підходи

# Compare goodness of fit

gofstat(list(fit.weibull, fit.gamma))

Goodness-of-fit statistics
                             1-mle-weibull 2-mle-gamma
Kolmogorov-Smirnov statistic    0.06863193   0.1204876
Cramer-von Mises statistic      0.05673634   0.2060789
Anderson-Darling statistic      0.38619340   1.2031051

Goodness-of-fit criteria
                               1-mle-weibull 2-mle-gamma
Aikake's Information Criterion      519.8537    531.5180
Bayesian Information Criterion      524.5151    536.1795

1
Я не можу переглянути, але у вас є проблема із зворотним доступом до fitdistrplusта gofstatу вашому попереднику

2
Однорядкова рекомендація: квантильно-квантильний графік - найкращий єдиний графік для цієї мети. Порівнюючи спостережувані та пристосовані щільності важко зробити добре. Наприклад, важко помітити систематичні відхилення при високих значеннях, які науково і практично часто є дуже важливими.
Нік Кокс

1
Радий, що ми згодні. ОП починається з 10 000 балів. Багато проблем починається з набагато меншої кількості, і тоді отримати гарне уявлення про щільність може бути проблематично.
Нік Кокс

1
@LingZhang Для порівняння підходів ви можете подивитися на значення AIC. Кращим є пристосування з найнижчим AIC. Крім того, я не погоджуюся з тим, що дистрибуція Weibull і Gamma є абсолютно однаковою у QQ-Plot. Окуляри пристосування Вейбулла ближче до лінії порівняно з гаммою, особливо на хвостах. Відповідно, AIC для придатності Weibull менший порівняно з гаммою.
COOLSerdash

1
Пряміше - краще. Також дивіться stats.stackexchange.com/questions/111010/… Принципи однакові. Систематичне відхилення від лінійності є проблемою.
Нік Кокс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.