Jak zauważył @whuber, metody statystyczne nie działają tutaj dokładnie. Musisz wywnioskować dystrybucję z innych źródeł. Kiedy znasz rozkład, masz ćwiczenie nieliniowego rozwiązywania równań. Oznacz przez funkcję kwantylową wybranego rozkładu prawdopodobieństwa za pomocą wektora parametru θ . Masz następujący nieliniowy układ równań:fθ
q0.05q0.5q0.95=f(0.05,θ)=f(0.5,θ)=f(0.95,θ)
gdzie to twoje kwantyle. Musisz rozwiązać ten system, aby znaleźć θ . Teraz praktycznie dla każdego rozkładu 3-parametrowego znajdziesz wartości parametrów spełniających to równanie. W przypadku rozkładów 2-parametrowych i 1-parametrowych ten system jest zawyżony, więc nie ma dokładnych rozwiązań. W takim przypadku możesz wyszukać zestaw parametrów, który minimalizuje rozbieżność:qθ
(q0.05−f(0.05,θ))2+(q0.5−f(0.5,θ))2+(q0.95−f(0.95,θ))2
Tutaj wybrałem funkcję kwadratową, ale możesz wybrać, co chcesz. Zgodnie z komentarzami @whuber można przypisywać wagi, dzięki czemu ważniejsze kwantyle można dopasować dokładniej.
Dla czterech i więcej parametrów system jest niedookreślony, więc istnieje nieskończona liczba rozwiązań.
Oto przykładowy kod R ilustrujący to podejście. Dla celów demonstracyjnych generuję kwantyle z dystrybucji Singh-Maddala z pakietu VGAM . Ten rozkład ma 3 parametry i jest wykorzystywany w modelowaniu rozkładu dochodu.
q <- qsinmad(c(0.05,0.5,0.95),2,1,4)
plot(x<-seq(0,2,by=0.01), dsinmad(x, 2, 1, 4),type="l")
points(p<-c(0.05, 0.5, 0.95), dsinmad(p, 2, 1, 4))
Teraz utwórz funkcję, która ocenia nieliniowy układ równań:
fn <- function(x,q) q-qsinmad(c(0.05, 0.5, 0.95), x[1], x[2], x[3])
Sprawdź, czy prawdziwe wartości spełniają równanie:
> fn(c(2,1,4),q)
[1] 0 0 0
Do rozwiązania układu równań nieliniowych używam funkcji nleqslv
z pakietu nlqeslv .
> sol <- nleqslv(c(2.4,1.5,4.3),fn,q=q)
> sol$x
[1] 2.000000 1.000000 4.000001
Jak widzimy, otrzymujemy dokładne rozwiązanie. Spróbujmy teraz dopasować rozkład logarytmiczno-normalny do tych kwantyli. W tym celu użyjemy optim
funkcji.
> ofn <- function(x,q)sum(abs(q-qlnorm(c(0.05,0.5,0.95),x[1],x[2]))^2)
> osol <- optim(c(1,1),ofn)
> osol$par
[1] -0.905049 0.586334
Teraz wykreśl wynik
plot(x,dlnorm(x,osol$par[1],osol$par[2]),type="l",col=2)
lines(x,dsinmad(x,2,1,4))
points(p,dsinmad(p,2,1,4))
Z tego natychmiast widzimy, że funkcja kwadratowa nie jest tak dobra.
Mam nadzieję że to pomoże.