2016-08-08 33 views
1

Ich versuche, eine abgeschnittene Normalverteilung zu einigen Daten anzupassen. Allerdings habe ich in den folgenden Fehler ausgeführt wird:Anpassen von truncnorm mit fitdistrplus

<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data,  gr = gradient, ddistnam = ddistname, hessian = TRUE, method = meth,  lower = lower, upper = upper, ...): non-finite finite-difference value [1]> 
Error in fitdist(testData, "truncnorm", start = list(a = 0, mean = 0.8, : 
    the function mle failed to estimate the parameters, 
       with the error code 100 

Ich bin nicht sicher, was falsch läuft - ich habe gelesen, dass es in einigen Fällen Probleme passend sein kann, wenn die anfänglichen Vermutungen sind falsch oder höher als die tatsächliche Werte, aber ich habe eine Reihe von verschiedenen Startwerten ausprobiert und keiner scheint zu funktionieren.

Hier ist eine kleine Auswahl meiner Daten und der Code verwendete ich den Fehler zu erhalten:

library(fitdistrplus) 
library(truncnorm) 
testData <- c(3.2725167726, 0.1501345235, 1.5784128343, 1.218953218, 1.1895520932, 
       2.659871271, 2.8200152609, 0.0497193249, 0.0430677458, 1.6035277181, 
       0.2003910167, 0.4982836845, 0.9867184303, 3.4082793339, 1.6083770189, 
       2.9140912221, 0.6486576911, 0.335227878, 0.5088426851, 2.0395797721, 
       1.5216239237, 2.6116576364, 0.1081283479, 0.4791143698, 0.6388625172, 
       0.261194346, 0.2300098384, 0.6421213993, 0.2671907741, 0.1388568942, 
       0.479645736, 0.0726750815, 0.2058983462, 1.0936704833, 0.2874115077, 
       0.1151566887, 0.0129750118, 0.152288794, 0.1508512023, 0.176000366, 
       0.2499423442, 0.8463027325, 0.0456045486, 0.7689214668, 0.9332181529, 
       0.0290242892, 0.0441181842, 0.0759601229, 0.0767983979, 0.1348839304 
) 

fitdist(testData, "truncnorm", start = list(a = 0, mean = 0.8, sd = 0.9)) 

Antwort

1

Das Problem ist, dass die MLE-Schätzer für den Parameter mean als die untere Grenze zunehmend negative Schätzungen liefert a gegen Null (beachten Sie, dass diese nicht im start Parameter angegeben werden müssen, sondern innerhalb fix.arg):

fitdist(testData, "truncnorm", fix.arg=list(a=-.5), 
     start = list(mean = mean(testData), sd = sd(testData))) 
fitdist(testData, "truncnorm", fix.arg=list(a=-.2), 
     start = list(mean = mean(testData), sd = sd(testData))) 
fitdist(testData, "truncnorm", fix.arg=list(a=-.15), 
     start = list(mean = mean(testData), sd = sd(testData))) 

Eine Möglichkeit große negative Werte zu verhindern für mean ist eine untere Schranke für die Optimierung zu verwenden:

fitdist(testData, "truncnorm", fix.arg=list(a=0), 
     start = list(mean = mean(testData), sd = sd(testData)), 
     optim.method="L-BFGS-B", lower=c(0, 0)) 

Dies ist jedoch das Abschätzungsverfahren ändert; Tatsächlich erlegen Sie den Parametern zusätzliche Beschränkungen auf und erhalten möglicherweise unterschiedliche Antworten mit unterschiedlichen Untergrenzen.

+0

Dies lässt mich mit ein paar Fragen - die Daten, mit denen ich arbeite nicht weniger als Null sein kann, aber ich interessiere mich nicht unbedingt dafür, ob der Mittelwert negativ ist, wie ich gerade versuche zu passen eine Verteilung auf die Daten, so gut ich kann. Angesichts der Tatsache, dass mle-Schätzer tendenziell negativ sind, wenn "a" auf Null geht, wäre es besser, eine nicht-male Schätzung zu verwenden? Macht es Sinn, negative Werte von "a" zu haben, wenn die Daten selbst nicht negativ sein können? – mlinegar

+0

Das sind sehr interessante Fragen, als ich vor einer Weile selbst über sie gestolpert bin und ich musste nachdenken, um sie herauszufinden. Ich denke jedoch, dass sie besser zu http://stats.stackexchange.com/ passen würden, da sie statistischer Natur sind. Wenn Sie sie dort mit Ihrem Beispiel veröffentlichen, werde ich Ihnen gerne eine erweiterte Antwort geben (die, wenn ich darüber nachdenke, dort vielleicht schon verfügbar ist). –

+0

Danke, ich habe gerade die neue Frage hier gepostet: http://stats.stackexchange.com/questions/229624/fitting-truncated-distributions-using-fitdistrplus-with-a-lower-bound-of-zero – mlinegar