Jak narysować dopasowany wykres i rzeczywisty wykres rozkładu gamma na jednym wykresie?

10

Załaduj potrzebny pakiet.

library(ggplot2)
library(MASS)

Wygeneruj 10 000 liczb dopasowanych do rozkładu gamma.

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

Narysuj funkcję gęstości prawdopodobieństwa, zakładając, że nie wiemy, do którego rozkładu x pasuje.

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

Z wykresu możemy dowiedzieć się, że rozkład x jest podobny do rozkładu gamma, więc używamy fitdistr()w pakiecie, MASSaby uzyskać parametry kształtu i szybkości rozkładu gamma.

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

Narysuj rzeczywisty punkt (czarna kropka) i dopasowany wykres (czerwona linia) na tym samym wykresie, a oto pytanie, najpierw spójrz na wykres.

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()

dopasowany wykres

Mam dwa pytania:

  1. Rzeczywiste parametry shape=2, rate=0.2oraz parametry korzystać z funkcji fitdistr(), aby uzyskać to shape=2.01, rate=0.20. Te dwa są prawie takie same, ale dlaczego dopasowany wykres nie pasuje do rzeczywistego punktu, musi być coś nie tak na dopasowanym wykresie lub sposób, w jaki narysowałem dopasowany wykres i rzeczywiste punkty, jest całkowicie błędny, co powinienem zrobić ?

  2. Po tym, jak uzyskać parametr modelu I ustalić, w jaki sposób mogę ocenić model, coś RSS (resztkowa suma kwadratowy) dla modelu liniowego lub p-wartości shapiro.test(), ks.test()i inne badania?

Mam słabą wiedzę statystyczną, czy mógłbyś mi pomóc?

ps: Mam wyszukiwanie w Google, stackoverflow i CV wiele razy, ale nie znalazłem nic związanego z tym problemem

Ling Zhang
źródło
1
Najpierw zadałem to pytanie w przepełnieniu stosu, ale wydawało się, że to pytanie należy do CV, przyjaciel powiedział, że źle zrozumiałem funkcję masy prawdopodobieństwa i funkcję gęstości prawdopodobieństwa, nie mogłem tego całkowicie zrozumieć, więc wybacz mi, że ponownie odpowiedziałem na to pytanie w CV
Ling Zhang
1
Twoje obliczenia gęstości są nieprawidłowe. Prostym sposobem obliczenia jest h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density).
@Pascal masz rację, rozwiązałem pytanie 1, dziękuję!
Ling Zhang
Zobacz odpowiedź poniżej, densityfunkcja jest przydatna.
Rozumiem, jeszcze raz dziękuję za edycję i rozwiązanie mojego pytania
Ling Zhang

Odpowiedzi:

11

Pytanie 1

Sposób, w jaki obliczasz gęstość ręcznie, wydaje się nieprawidłowy. Nie ma potrzeby zaokrąglania liczb losowych z rozkładu gamma. Jak zauważył @Pascal, możesz użyć histogramu, aby wykreślić gęstość punktów. W poniższym przykładzie używam funkcji densitydo oszacowania gęstości i wykreślenia jej jako punktów. Prezentuję dopasowanie zarówno z punktami, jak i histogramem:

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()

Gęstość gamma

# 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()

Dopasowanie gęstości gamma

# 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()

Histogram z dopasowaniem

Oto rozwiązanie dostarczone przez @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()

Punkty gęstości histogramu

pytanie 2

Aby ocenić poprawność dopasowania, polecam pakiet fitdistrplus. Oto, jak można go wykorzystać, aby dopasować dwa rozkłady i porównać ich dopasowania graficznie i numerycznie. Polecenie gofstatwypisuje kilka miar, takich jak AIC, BIC i niektóre statystyki gof, takie jak test KS itp. Służą one głównie do porównywania pasowań różnych rozkładów (w tym przypadku gamma względem Weibulla). Więcej informacji można znaleźć w mojej odpowiedzi tutaj :

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 słusznie informuje, że wykres QQ (prawy górny panel) jest najlepszym pojedynczym wykresem do oceniania i porównywania pasowań. Zagęszczone gęstości są trudne do porównania. Załączam również inne grafiki ze względu na kompletność.

Porównaj pasowania

# 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
COOLSerdash
źródło
1
Nie mogę dokonać korekty, ale masz problem ze zwrotem za fitdistrplusi gofstatw odpowiedzi
2
Rekomendacja jednowierszowa: wykres kwantylowo-kwantylowy jest najlepszym pojedynczym wykresem do tego celu. Porównywanie zaobserwowanych i dopasowanych gęstości jest trudne do zrobienia. Na przykład trudno jest dostrzec systematyczne odchylenia przy wysokich wartościach, które z naukowego i praktycznego punktu widzenia są często bardzo ważne.
Nick Cox,
1
Cieszę się, że się zgadzamy. PO zaczyna się od 10 000 punktów. Wiele problemów zaczyna się od znacznie mniejszej liczby, a następnie uzyskanie dobrego wyobrażenia o gęstości może być problematyczne.
Nick Cox,
1
@LingZhang Aby porównać pasowania, możesz spojrzeć na wartość AIC. Preferowane jest dopasowanie z najniższym AIC. Nie zgadzam się również z tym, że rozkład Weibulla i gamma jest dość taki sam na wykresie QQ. Punkty dopasowania Weibull są bliżej linii w porównaniu z dopasowaniem Gamma, szczególnie na ogonach. Odpowiednio, AIC dla dopasowania Weibull jest mniejsze w porównaniu do dopasowania Gamma.
COOLSerdash
1
Prostsze jest lepsze. Zobacz także stats.stackexchange.com/questions/111010/ ... Zasady są takie same. Systematyczne odchylenie od liniowości stanowi problem.
Nick Cox