2016-05-05 43 views
0

der Ausgangsfehler ist: MinimizerException: Kann nicht Konfidenzintervalle ohne vernünftige Unsicherheit bestimmen schätztLMFIT Konfidenzintervall Unsicherheitsschätzungen Fehler auf Python

Warum ich diesen Fehler habe? Wie kann ich Unsicherheitsschätzungen berechnen und dieses Problem lösen?

for dosya1 in glob.glob("mean*"): 
    data1=np.genfromtxt(dosya1, skip_header=0, skip_footer=0, names=["wavelength","mean"]) 
    x=data1["wavelength"] 

    mod=VoigtModel() 
    pars = mod.guess(y, x=x) 
    pars['gamma'].set(value=0.7, vary=True, expr="")  
out=mod.fit(y,pars, x=x) 

    pars=lmfit.Parameters() 
    pars.add_many(('amp', out.params["amplitude"].value), ('sig', out.params["sigma"].value), ("gam",out.params["gamma"].value),("cent",out.params["center"].value)) 

def residual(p): 
    amp=p["amp"].value 
    sig=p["sig"].value 
    gam=p["gam"].value 
    cent=p["cent"].value 
    return ((wofz((x-cent + wofz(gam).imag)/(sig*(sqrt(2)))).real)/(sig*(sqrt(2))))- y 

mini = lmfit.Minimizer(residual, pars) 
result=mini.minimize() 

ci = lmfit.conf_interval(mini, result) 
lmfit.printfuncs.report_ci(ci) 
+0

Könnten Sie bitte etwas mehr Informationen über das Format Ihrer Restfunktion hinzufügen? Was ist woz? Ich gehe davon aus, dass seit Ihrer Minimierungsroutine ein reduziertes Array innerhalb des Residuums zurückgegeben wird. Eine Sache, die Sie vielleicht ausprobieren möchten, ist das Hinzufügen angemessener Grenzen für die Parameter, die Sie definieren, oder das Beschränken Ihrer Konfidenzintervallberechnung auf einige wenige Parameter, um mit der Diagnose zu beginnen. Zum Beispiel 'params.add ('gamma', Wert = -0,7, max = 0, min = 4) 'oder' lmfit.conf_interval (mini, result, p_names = ['gamma']' Welche Version von lmfit benutzt du? – XtremeJake

Antwort

0

Sie diese Fehlermeldung erhalten, wenn lmfit.minimize() (eigentlich leastsq(), was es nennt) nicht in der Lage ist Unsicherheiten abzuschätzen, indem die Krümmung Matrix zu invertieren. Es verwendet diese Werte (die oft sehr gute Schätzungen sind, BTW) als Maßstab für die explizite Untersuchung des Parameterraums. Es gibt mehrere mögliche Gründe, warum leastsq() Unsicherheiten nicht schätzen kann. Häufige Gründe sind, dass eine oder mehrere der Variablen die Anpassung nicht beeinflussen oder der Rest NaNs enthält.

Es ist schwer vorherzusagen, wann dies passieren könnte. Sie sollten die Möglichkeit berücksichtigen und/oder prüfen, ob die anfängliche Anpassung erfolgreich war und die anfängliche Schätzung der Unsicherheiten vornehmen (überprüfen Sie result.errorbars), bevor Sie conf_interval() aufrufen.

+0

Danke Matt für die Arbeit an lmfit. Können Sie noch etwas anderes in dem Fall beraten, wenn die Schätzung der Unsicherheiten scheitert? Dh wenn keine Variable keine Wirkung hat und die Residuen keine NaNs enthalten. Mein Eindruck ist das lostsq ziemlich oft kann nicht die Kovarianzmatrix ergeben Gibt es andere Möglichkeiten, die Konfidenzbereiche zu erhalten? – dnalow

+0

Nun, es hängt wahrscheinlich von den Details ab, warum die Unsicherheitsschätzung fehlgeschlagen.Wenn alle Variablen eine begrenzte Wirkung haben und es keine NaNs gibt, sollte es funktionieren - es sollte nicht "ziemlich oft" scheitern. Haben Sie mehrere Beispiele, wo es ist? Auch Stackoverflow ist ein schrecklicher Ort für eine solche Diskussion, und seine Verwendung für Fragen zu lmfit sollte nicht ermutigt werden. Wechseln Sie auf die entsprechende Mailingliste. –

+0

Das gleiche Problem mit keiner erhaltenen Kovarianzmatrix. Wo befindet sich die passende Mailingliste? – Tim