Anpassungsgüte für nichtlineares Modell

8

Wir haben den beobachteten Daten eine nichtlineare Funktion angepasst. Der nächste Schritt sollte die Beurteilung der Anpassungsgüte dieser Funktion sein (wie für lineare Modelle).R2

Was sind die üblichen Methoden, um dies zu messen?

Bearbeiten 1:

Die Anpassung wurde wie folgt durchgeführt:

  1. Führen Sie eine lineare Regression mit unabhängigen Variablen A und B durch .
  2. Berechnen Sie die Verteilungsparameter aus den Regressionsparametern. (Die Verteilung ist nichtlinear und hat die Variable C als Eingabe.)
  3. Bewerten Sie die Anpassungsgüte der nichtlinearen Verteilung, indem Sie die geschätzten mit den beobachteten Daten vergleichen.

Bearbeiten 2:

Beispiele für die oben genannten Schritte:

  1. Regressionsmodell: log(y)=β0+β1log(a)+β2log(b)
  2. undθ=β2für die folgende nichtlineare Verteilung:f(a)=ρa-θρ=β0β1θ=β2f(a)=ρaθ
  3. f(a)(a,f(a))
Marco
quelle
5
"Anpassungsgüte" hängt davon ab, wie die Anpassung durchgeführt wurde. Beispielsweise sollte sich das geeignete GoF-Maß für einen Maximum-Likelihood-Schätzer vom GoF-Maß für einen Schätzer der kleinsten Quadrate unterscheiden, wenn die Zufallskomponente keine additive Normalvariable ist. Wenn Sie ein bestimmtes Problem haben, möchten Sie möglicherweise angeben, wie Sie die Anpassung durchgeführt haben.
whuber
2
R2R2
1
@whuber Ich habe die Beschreibung der durchgeführten Schritte in den obigen Fragen hinzugefügt.
Marco
@Alexis Danke für die Referenzen, ich werde sie mir ansehen.
Marco
1
f(a)

Antworten:

2

Vielleicht steckt noch mehr dahinter, aber für mich scheint es, dass Sie nur die Anpassungsgüte (GoF) für eine Funktion f (a) bestimmen möchten , die an einen bestimmten Datensatz (a, f (a)) angepasst ist. Das Folgende beantwortet also nur Ihre dritte Unterfrage (ich denke nicht, dass die erste und die zweite direkt für die dritte relevant sind).

Normalerweise GoF bestimmt werden parametrisch (wenn Sie die Verteilung der Funktionsparameter kennen) oder nicht-parametrisch (wenn Sie nicht wissen , sie). Möglicherweise können Sie Parameter für die Funktion ermitteln, da diese exponentiell oder gamma / weibull zu sein scheint (vorausgesetzt, die Daten sind kontinuierlich). Trotzdem werde ich fortfahren, als ob Sie die Parameter nicht kennen. In diesem Fall handelt es sich um einen zweistufigen Prozess . Zunächst müssen Sie die Verteilungsparameter für Ihren Datensatz bestimmen . Zweitens führen Sie einen GoF-Test für die definierte Verteilung durch. Um zu vermeiden, dass ich mich wiederhole, verweise ich Sie an dieser Stelle auf meine frühere Antwortauf eine verwandte Frage, die einige hilfreiche Details enthält. Offensichtlich kann diese Antwort leicht auf andere als die darin erwähnten Verteilungen angewendet werden.

Zusätzlich zu den dort erwähnten GoF-Tests können Sie einen anderen Test in Betracht ziehen - den Chi-Quadrat-GoF-Test . Im Gegensatz zu KS und AD - Tests, die nur für kontinuierliche Verteilungen anwendbar sind, Chi-Quadrat - Test GoF ist anwendbar auf beiden diskret und kontinuierlich denjenigen. Der Chi-Quadrat-GoF-Test kann in R unter Verwendung eines von mehreren Paketen durchgeführt werden: statsintegriertes Paket (Funktion chisq.test()) und vcdPaket (Funktion goodfit()- nur für diskrete Daten). Weitere Details finden Sie in diesem Dokument .

Aleksandr Blekh
quelle
1
Der Link zu "Meine frühere Antwort" funktioniert nicht mehr, da die Frage wahrscheinlich entfernt wurde.
Amonet
1
@Amonet Danke, dass du mich informiert hast. Ich konnte auf die gelöschten Fragen und Antworten zugreifen und sie als öffentliche Übersicht wiederherstellen. Bitte sehen Sie gist.github.com/ablekh/… . Hoffe das hilft.
Aleksandr Blekh
0

Nun, beim maschinellen Lernen wird die so genannte Kreuzvalidierung ziemlich häufig zum Zweck des Modelltests durchgeführt (testen Sie, ob dieser Modelltyp mit diesen Hyperparametern - wie der Anzahl der Freiheitsgrade oder was auch immer - zu Ihrem Problem passt) - Sie teilen Ihr Problem auf Daten mehrmals in Zug- und Testdatensätze einfügen, dann die Optimierung über den Trainingssatz ausführen und die Qualität über die Testdaten berechnen. Der vertraulichste Weg ist die sogenannte "QxT-fache Kreuzvalidierung". Der Pseudocode könnte mögen:

cv_values = []
for t in range(T):
    split = randomsplit(data, number_of_parst = Q)
    for test_id in range(Q):
        model.fit(split[:test_id] + split[test_id + 1:] # test on everything excepting test_id
        cv_values.append(model.test(split[test_id]))

cv_values.mean() # whatever
MInner
quelle
Danke für deine Antwort. Wie sieht Ihre model.test (...) Funktion aus?
Marco