Warum Sie in Schwierigkeiten geraten?
Wenn Sie lnlike(c(10, 0.3))
tun, erhalten Sie -Inf
. Deshalb lautet die Fehlermeldung lnlike
statt optim
.
Oft ist n
bekannt, und nur muss geschätzt werden. In dieser Situation ist entweder der Momentschätzer oder der Maximum-Likelihood-Schätzer in geschlossener Form, und es ist keine numerische Optimierung erforderlich. Es ist wirklich seltsam, n
zu schätzen.
Wenn Sie schätzen möchten, müssen Sie sich bewusst sein, dass es eingeschränkt ist. Prüfen
range(xi) ## 5 15
Sie Beobachtungen haben Bereich [5, 15]
daher kommt es, dass n >= 15
erforderlich. Wie können Sie einen Anfangswert von 10 übergeben? Die Suchrichtung für n
, sollte von einem großen Anfangswert sein, und dann allmählich nach unten suchen, bis es max(xi)
erreicht. Sie könnten also 30
als Anfangswert für n
versuchen.
Zusätzlich müssen Sie lnlike
nicht in der aktuellen Weise definieren. Tun Sie dies:
lnlike <- function(theta, x) -sum(dbinom(x, size = theta[1], prob = theta[2], log = TRUE))
optim
wird häufig zur Minimierung verwendet (obwohl es Maximierung tun können). Ich habe ein Minuszeichen in die Funktion gesetzt, um eine negative Log-Wahrscheinlichkeit zu erhalten. Auf diese Weise minimieren Sie lnlike
w.r.t. theta
.
- Sie sollten auch Ihre Beobachtungen
xi
als zusätzliches Argument an lnlike
weiterleiten, anstatt es aus der globalen Umgebung zu nehmen.
Naive try mit optim
:
In meinem Kommentar, ich schon gesagt, dass ich nicht glaube, optim
mit n
arbeiten zu schätzen, weil n
ganze Zahlen sein müssen, während optim
für kontinuierliche Variablen verwendet wird, . Diese Fehler und Warnungen sollen Sie überzeugen.
optim(c(30,.3), fn = lnlike, x = xi, hessian = TRUE)
Error in optim(c(30, 0.3), fn = lnlike, x = xi, hessian = TRUE) :
non-finite finite-difference value [1]
In addition: There were 15 or more warnings (use warnings() to see the
first 15
> warnings()
Warning messages:
1: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
2: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
3: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
4: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
5: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
Lösung?
Ben hat Ihnen einen Weg gegeben. Anstatt optim
n
zu schätzen, führen wir manuell eine Rastersuche nach n
durch. Für jeden Kandidaten n
führen wir eine univariate Optimierung w.r.t. p
. (Ups, in der Tat, es gibt keine Notwendigkeit, numerische Optimierung hier zu tun.) Auf diese Weise erhalten Sie eine Profilwahrscheinlichkeit von n
. Dann finden wir n
auf dem Raster, um diese Profilwahrscheinlichkeit zu minimieren.
Ben hat Ihnen alle Details zur Verfügung gestellt, und ich werde das nicht wiederholen. Schöne (und schnelle) Arbeit, Ben!
Was ist der Fehler? – duffymo
Ich weiß nicht, wie ich zu der Antwort komme, aber ich sehe auch keinen Fehler ... Könnten Sie es posten? Ihre Frage sollte sich mehr darauf konzentrieren, wie Sie den Fehler beheben können, um den Weg zur Lösung zu finden. (Die Lösung könnte nur den Fehler beheben.) –
@ZheyuanLi Dies ist ein illustratives Beispiel für das, was ich brauche. – andre