2013-03-15 29 views
5

Mam 2 tablice o równej długości. Poniższa funkcja próbuje obliczyć nachylenie za pomocą tych tablic. Zwraca średnią nachylenia między poszczególnymi punktami. W przypadku poniższego zestawu danych wydaje mi się, że uzyskuję inne wartości niż w przypadku dokumentów Excel i Google.Obliczanie nachylenia szeregu wartości

 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); 
} 

Wyjście

Google: 0,755

getSlope(): 0,962121212121212

Excel: 0,7501

+0

Patrz przykład liczbowy [tutaj] (http: // pl .wikipedia.org/wiki/Simple_linear_regression) w obliczeniach. To powinno być trywialne dla kodu. – karmanaut

Odpowiedz

4

Założę się, że pozostałe dwie metody są obliczane na least-squares fit, a ty nie.

Kiedy zweryfikować tę hipotezę za pomocą R, ja też dostać nachylenie około 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 *** 

Odpowiednia liczba jest 7.551e-01. Warto również zauważyć, że linia ma przechwycenie około -1265.

Oto zdjęcie z najmniejszych kwadratów pasuje:

lm fit

Co do wdrożenia tego w kodzie, patrz Compute least squares using java

-1

Powinieneś być podzielenie przez x_values.length - 1. Liczba stoków jest parami.

Edytuj: Przykład Wiki w moich komentarzach pokazuje, jak obliczyć alfa i beta, które określają nachylenie linii regresji liniowej.

+1

Wartość wyjściowa x_values.length wynosi 11. Odjęcie o 1 dałoby wyższe średnie nachylenie. – Nyx

+0

Czy jesteś pewien, że stosujesz właściwą logikę średnią w Excel/Google Docs? Czy możesz opublikować makro? – karmanaut

+0

'SLOPE (B2: B22, A2: A22)' Tutaj kolumna B zawiera 'y_values', a kolumna A zawiera' x_wartości'. – Nyx

2

Ta funkcja niewiele Ci pomoże, ponieważ nie uwzględnia szerokości poszczególnych odcinków linii. Rozważ różnice w stosowaniu go w punktach (0,0), (1000,1000) i (1001, 2000) w porównaniu z (0,0), (1,1) i (2, 1001). Oba przypadki mają kolejne zbocza 1 i 1000, ale wyglądają zupełnie inaczej.

Musisz zastosować metodę najmniejszych kwadratów: http://en.wikipedia.org/wiki/Least_squares, aby znaleźć linię, która jest najbardziej zbliżona do Twojego zbioru danych.

Jeszcze jedna rada: nigdy nie rzucaj java.lang.Exception. Zawsze wybieraj bardziej specyficzny wyjątek, nawet jeśli sam musisz napisać klasę. Osoby używające Twojego kodu będą musiały obsłużyć java.lang.Exception, co źle wpływa na ich inny kod.

+0

To się zgadza. – karmanaut

+0

Metoda najmniejszych kwadratów to tylko część szerszej klasy rozwiązań tego problemu: http://en.wikipedia.org/wiki/Linear_regression – roim

Powiązane problemy