2016-05-19 33 views
0

Derzeit habe ich eine Abhängigkeit zu Commons-Mathe 2.1, aber ich möchte es auf Commons-math 3.6 zu aktualisieren. Leider gibt es einige Testfälle, die nicht mehr funktionieren. Ich weiß, was mein Problem verursacht, aber ich weiß nicht, wie ich den Testfall entsprechend ändern kann, um das korrekte Verhalten wie zuvor zu testen.OLS multiple lineare Regression mit commons-math

habe ich folgenden Testcode:

@Test 
public void testIdentityMatrix() { 
    double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } }; 
    double[] y = { 1, 2, 3, 4 }; 

    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression(); 
    regression.setNoIntercept(true); 
    regression.newSampleData(y, x); 

    double[] b = regression.estimateRegressionParameters(); 
    for (int i = 0; i < y.length; i++) 
    { 
     assertEquals(b[i], y[i], 0.001); 
    } 
} 

Nach dem Upgrade auf commons-Mathe 3.6 die OLSMultipleLinearRegression die gegebenen Matrix x und y-Vektor für gültige Inhalte überprüft. Und diese Überprüfung fehlschlägt mit der Meldung:

nicht genügend Daten (4 Reihen) für diese viele Prädiktoren (4 Prädiktoren)

Was muß ich ändern, dass der Testfall zu korrigieren?

Antwort

1

Dies ist ein Fehler in Commons Math 3.x. Wenn in dem Modell kein Schnittpunkt vorhanden ist, sollte die Anzahl der Beobachtungen, die der Anzahl der Regressoren entspricht, OK sein, solange die Entwurfsmatrix nicht singulär ist. In Ihrem Beispiel meinen Sie, dass die dritte x-Zeile {0,0,1,0} ist (ansonsten ist die Design-Matrix singulär). Mit dieser Änderung an Ihren Daten und dem Code-Patch, der in der Hipparchus fix angewendet wurde, ist Ihr Test erfolgreich. Dieser Fehler wird als MATH-1392 in Commons Math verfolgt.

0

Die Anzahl der Proben muss größer sein als die Anzahl der Variablen. Anscheinend ist dein Testfall nicht korrekt. Sie müssten mindestens ein weiteres Beispiel hinzufügen. Wenn Sie

double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } }; 

zu

double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 }, {1,0,0,0} }; 

ändern sollte es funktionieren. (obwohl ich es nicht getestet habe).

0

Ich denke, die 3. Reihe von x sollte 0010 statt 0001 sein?

Wenn Sie jedoch x zu

ändern

double [] [] x = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0), {0, 0, 0, 1}, {1,1,1,1}};

und y ändern

double [] y = {1, 2, 3, 4, 10};

dass das letzte Element die Summe anderer Elemente ist, dann funktioniert es.