2013-03-15 13 views
5

Ich habe 2 Arrays von gleicher Länge. Die folgende Funktion versucht die Steigung mit diesen Arrays zu berechnen. Er gibt den Durchschnitt der Steigung zwischen den einzelnen Punkten zurück. Für den folgenden Datensatz scheinen mir andere Werte zu erhalten als Excel und Google Text & Tabellen.Berechnen der Steigung einer Reihe von Werten

 double[] x_values = { 1932, 1936, 1948, 1952, 1956, 1960, 1964, 1968, 
      1972, 1976, 1980 }; 
    double[] y_values = { 197, 203, 198, 204, 212, 216, 218, 224, 223, 225, 
      236 }; 



public static double getSlope(double[] x_values, double[] y_values) 
     throws Exception { 

    if (x_values.length != y_values.length) 
     throw new Exception(); 

    double slope = 0; 

    for (int i = 0; i < (x_values.length - 1); i++) { 
     double y_2 = y_values[i + 1]; 
     double y_1 = y_values[i]; 

     double delta_y = y_2 - y_1; 

     double x_2 = x_values[i + 1]; 
     double x_1 = x_values[i]; 

     double delta_x = x_2 - x_1; 

     slope += delta_y/delta_x; 
    } 

    System.out.println(x_values.length); 
    return slope/(x_values.length); 
} 

Ausgabe

Google: 0,755

getSlope(): 0,962121212121212

Excel: 0,7501

+0

das Zahlenbeispiel siehe [hier] (http: // en .wikipedia.org/wiki/Simple_linear_regression) bei der Berechnung. Dies sollte trivial zu programmieren sein. – karmanaut

Antwort

4

Ich wette, die anderen beiden Methoden sind die Berechnung der least-squares fit, während Sie nicht sind.

Wenn ich diese Vermutung bestätigen R verwenden, erhalte ich auch die Neigung von etwa 0,755:

> summary(lm(y~x)) 

Call: 
lm(formula = y ~ x) 

Coefficients: 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept) -1.265e+03 1.793e+02 -7.053 5.97e-05 *** 
x   7.551e-01 9.155e-02 8.247 1.73e-05 *** 

Die entsprechende Zahl der 7.551e-01 ist. Es ist auch erwähnenswert, dass die Linie einen Achsenabschnitt von ungefähr -1265 hat. Hier

ist ein Bild von den kleinsten Quadraten:

lm fit

Was dies im Code Implementierung findet Compute least squares using java

-1

Sie sollten durch x_values.length - 1 Dividieren werden. Anzahl der Pisten ist paarweise.

Edit: Wiki-Beispiel in meinen Kommentaren zeigt, wie die Alpha und Beta, die die Steigung der linearen Regressionslinie bestimmt berechnet.

+1

Die Ausgabe von x_values.length ist 11. Subtrahieren um 1 würde eine höhere durchschnittliche Steigung ergeben. – Nyx

+0

Sind Sie sicher, dass Sie die richtige Durchschnittslogik in Excel/Google Docs anwenden? Könnten Sie das Makro posten? – karmanaut

+0

'SLOPE (B2: B22, A2: A22)' Hier enthält die B-Spalte 'y_values' und die A-Spalte' x_values'. – Nyx

2

Diese Funktion wird Ihnen nicht viel helfen, da die Breite der verschiedenen Liniensegmente nicht berücksichtigt wird. Berücksichtigen Sie die Unterschiede bei der Anwendung auf die Punkte (0,0), (1000,1000) und (1001, 2000) gegenüber (0,0), (1,1) und (2, 1001). Beide Fälle haben aufeinanderfolgende Steigungen 1 und 1000, sehen aber sehr unterschiedlich aus.

Sie müssen die Methode der kleinsten Quadrate implementieren: http://en.wikipedia.org/wiki/Least_squares, um die Zeile zu finden, die Ihrem Datensatz am besten entspricht.

Noch ein Hinweis: Werfen Sie niemals einen java.lang.Exception. Wählen Sie immer eine spezifischere Ausnahme aus, auch wenn Sie die Klasse selbst schreiben müssen. Personen, die Ihren Code verwenden, müssen mit java.lang.Exception umgehen, was sich negativ auf ihren anderen Code auswirkt.

+0

Das ist richtig. – karmanaut

+0

Die Methode der kleinsten Quadrate ist nur ein Teil einer breiteren Klasse von Lösungen für dieses Problem: http://en.wikipedia.org/wiki/Linear_Regression – roim

Verwandte Themen