Anpassen einer Verteilung an bekannte Punkte auf der CDF

6

Ich bin kürzlich in eine Situation geraten, in der ich einige Wahrscheinlichkeitspunkte im Ende einer Verteilung kenne und eine Verteilung "anpassen" möchte, die diese Punkte im Ende durchläuft. Mir ist klar, dass dies chaotisch und nicht allzu genau ist und mit konzeptionellen Problemen behaftet ist. Vertrauen Sie mir jedoch, dass ich das wirklich tun möchte.

So effektiv kenne ich einige Punkte im Ende der CDF xals Werte und yals Wahrscheinlichkeit für diesen Wert oder kleiner. Hier ist R-Code zur Veranschaulichung meiner Daten:

x <- c(0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85)
y <- c(0.0666666666666667, 0.0625, 0.0659340659340659, 0.0563106796116505, 
       0.0305676855895196, 0.0436953807740325, 0.0267459138187221)

Dann erstelle ich eine Funktion, um Fehler zwischen meinen Daten und einer Beta-Distributions-CDF mit zu minimieren pbeta. Ich benutze SSE als Fit-Metrik und minimiere das dann mit -sum. Ich werfe in einer anfänglichen Vermutung als erster Param optimvon (9, .8)obwohl ich dies mit verschiedenen Vermutungen versucht habe und ich immer das gleiche Ergebnis. Der Ausgangspunkt, den ich verwende, ist das manuelle Garen von Parametern von Hand, die nahe beieinander liegen.

# function to optomize with optim
beta_func <- function(par, x) -sum( (pbeta( x, par[1], par[2]) - y)**2 ) 
out <- optim(c(9,.8), beta_func, lower=c(1,.5), upper=c(200,200), method="L-BFGS-B", x=x)

out <- out$par
print(out)
#> [1]  0.90000 23.40294

Unten zeichne ich die 'optimierte' Beta-Verteilung in Rot, meine tatsächlichen Daten in Blau und eine von Hand optimierte Startschätzung der Beta-Parameter in Schwarz.

plot(function(x) pbeta(x, shape1=out[1], shape2=out[2] ), 0, 1.5, col='red')
plot(function(x) pbeta(x, 9,.8), 0, 1.5, col='black', add=TRUE)
lines(x,y, col='blue')

Geben Sie hier die Bildbeschreibung ein

Ich kann nicht verstehen, was los ist optim, um eine Lösung zu finden, die schlimmer ist als meine anfängliche Vermutung. Ich habe die SSE für meine Startschätzung gegen die optimLösung berechnet und es sieht so aus, als hätte meine Schätzung eine viel größere -SSE:

# my guess
-sum( (pbeta( x, 9, .8) - y)**2)
#> [1] -0.03493344

# optim's output
-sum( (pbeta( x, .9, 23) - y)**2)
#> [1] -6.314587

Wenn ich die Vergangenheit als meinen Bayes'schen Prior verwende, vermute ich, dass ich optimfalsche Eingaben missverstehe oder füttere. Ich kann jedoch nicht wissen, was los ist. Alle Tipps wäre sehr dankbar.

Ich habe versucht, die CGOptimierungsmethode zu verwenden, aber die Ergebnisse unterscheiden sich nicht wesentlich und scheinen immer noch nicht so gut zu sein wie meine anfängliche Vermutung.

out <- optim(c(9,.8), beta_func, method="CG", x=x)
out <- out$par
print(out)
#> [1]  2.287611 11.124736
JD Long
quelle
1
Wie können diese Punkte für eine CDF "bekannt" sein und dennoch dazu neigen, mit zunehmenden Werten von abzunehmen ? x
JimB
1
Ich denke, dies sind Probleme, die verschwinden würden, wenn Sie diese Größen mit statistischen Standardwerkzeugen schätzen würden, anstatt das Rad neu zu erfinden.
Sycorax sagt Reinstate Monica
@JimB Die Quelle der Abwärtsneigung ist zweifach. Die Schätzungen für jeden Punkt stammen aus einem anderen Stichprobenverfahren, sodass zwei Dinge passieren: 1) Stichprobenrauschen 2) Verletzung der iid-Annahme für jeden Basiswert. Ich beschäftige mich hier weniger mit den Statistikproblemen als vielmehr mit dem Versuch, optimmein Gebot abzugeben.
JD Long
@Sycorax Ihr Vorschlag geht davon aus, dass statistische Standardwerkzeuge in meiner Situation funktionieren würden. Das ist eine falsche Annahme.
JD Long

Antworten:

5

Ich denke, Sie versuchen versehentlich, die quadratischen Fehler zu maximieren. Die Standardeinstellung für optim () ist die Minimierung der Funktion, sodass das negative Vorzeichen in Ihrer beta_func () zur Suche nach einer max.

Wenn Sie Ihre Funktion wie folgt ändern, erhalten Sie Werte, die Ihrer Vermutung näher kommen:

beta_func2 <- function(par, x) sum( (pbeta( x, par[1], par[2]) - y)**2 ) 
out2 <- optim(c(9,.8), beta_func2, lower=c(1,.5), upper=c(200,200), method="L-BFGS-B", x=x)
out2 <- out2$par
print(out2)
[1] 11.04296  0.50000

Sie können die neue Funktion anhand Ihrer Beobachtungen überprüfen (wobei out, x und y wie in Ihrem Beispiel definiert sind):

plot(x,(pbeta(x,out[1],out[2])), ylim=c(-.1,1), col="red", type="l")
points(x, (pbeta(x,9,0.8)), col="black", type="l")
points(x,(pbeta(x,out2[1],out2[2])), col="orange", type="l")
lines(x,y, col='blue')
title(main="Blue observed CDF, black guesstimate, gold optimized")

Geben Sie hier die Bildbeschreibung ein

lenkiefer
quelle
1
Ja, das war eindeutig mein Fehler. Ich dachte, ich hätte aus einer Laune heraus versucht, das Schild zu wechseln, aber das hatte ich eindeutig nicht. Ich war ziemlich verankert in der Idee, dass das Standardverhalten darin optimbestand, zu maximieren. Vielen Dank!
JD Long