2013-03-15 13 views
5

Ho 2 matrici di uguale lunghezza. La seguente funzione tenta di calcolare la pendenza usando questi array. Restituisce la media della pendenza tra ciascun punto. Per il set di dati che segue, mi sembra di ottenere valori diversi da Excel e Google Documenti.Calcolo della pendenza di una serie di valori

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

uscita

Google: 0,755

getSlope(): 0,962121212121212

Excel: 0,7501

+0

vedere l'esempio numerico [qui] (http: // it .wikipedia.org/wiki/Simple_linear_regression) sul calcolo. Questo dovrebbe essere banale da codificare. – karmanaut

risposta

4

Scommetto che gli altri due metodi stanno calcolando il least-squares fit, mentre non lo sei.

Quando verifico questa congettura utilizzando R, anch'io ottenere la pendenza di circa 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 *** 

Il numero rilevante è la 7.551e-01. Vale anche la pena notare che la linea ha un'intercettazione di circa -1265.

Ecco una foto dei minimi quadrati:

lm fit

Per quanto riguarda l'attuazione del presente nel codice, vedere Compute least squares using java

-1

si dovrebbe essere dividendo per x_values.length - 1. Il numero di piste è a coppie.

Modifica: l'esempio Wiki nei miei commenti mostra come calcolare l'alfa e il beta che determina la pendenza della linea di regressione lineare.

+1

L'output di x_values.length è 11. Sottraendo di 1 si ottiene una pendenza media più alta. – Nyx

+0

Sei sicuro di applicare la giusta logica media in Excel/Google Documenti? Potresti postare la macro? – karmanaut

+0

'SLOPE (B2: B22, A2: A22)' Qui, la colonna B contiene 'y_values' e la colonna A contiene' x_values'. – Nyx

2

Questa funzione non è di grande aiuto in quanto non tiene conto dell'ampiezza dei vari segmenti di linea. Considerare le differenze nell'applicarlo ai punti (0,0), (1000,1000) e (1001, 2000) contro (0,0), (1,1) e (2, 1001). Entrambi i casi hanno pendenze successive 1 e 1000, tuttavia hanno un aspetto molto diverso.

È necessario implementare il metodo dei minimi quadrati: http://en.wikipedia.org/wiki/Least_squares per trovare la linea che meglio si avvicina al set di dati.

Un altro consiglio: non gettare mai uno java.lang.Exception. Scegli sempre un'eccezione più specifica, anche se devi scrivere tu stesso la classe. Le persone che utilizzano il tuo codice dovranno gestire lo java.lang.Exception, che interferisce male con il loro altro codice.

+0

Questo è corretto. – karmanaut

+0

Il metodo dei minimi quadrati è solo una parte di una più ampia classe di soluzioni a questo problema: http://en.wikipedia.org/wiki/Linear_regression – roim

Problemi correlati