lunes, 3 de abril de 2017

Regresión Lineal

Ajuste de Curvas por Mínimos cuadrados
Regresion Lineal

Antecedentes

El ajuste de Curvas consiste en encontrar una función, tal que, esta se aproxime a los valores discretos tabulados por mediciones experimentales o bien desde el cálculo con valores específicos.


Es un método que facilita el cálculo de valores utilizados en estadística como la Media aritmética, desviación estándar y varianza, coeficiente de variación, entre otros; a través de una lectura de datos donde se automatiza el cálculo de dichos valores y aproxima un comportamiento de una muestra.

Justificación y propósito

El propósito de el ajuste de curvas es encontrar, como dicho anteriormente, una función que se ajuste a ciertos valores ya obtenidos. Esto, con el objeto de dar una aproximación a valores intermedios entre los valores discretizados así como también dar aproximaciones o intentar predecir valores fuera del rango de una nube de datos.


Esto nos permite modelar mediciones experimentales o casos donde todavía no existen tablas o datos. Además, con la información obtenida de estos métodos, se puede caracterizar a una población con base a una muestra que a su vez, permitiría también hacer análisis estadísticos como el análisis de tendencias o pruebas de hipótesis.


En el caso de la regresión lineal, como su mismo nombre lo dice, busca ajustar y describir una línea recta como función para describir el comportamiento de un conjunto de valores u observaciones experimentales.

Diagrama de Flujo

Codigo en c++


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

int main(){
    ifstream p_fileX;
    ifstream p_fileY;
    p_fileX.open("Data/Xdata.dat");
    p_fileY.open("Data/Ydata.dat");

    double XY = 0.0, X = 0.0, Y = 0.0, X2 = 0.0, n = 0.0;
    double a0, a1;      //Coeficiente para la fucion de la recta
    double yprom;       //Promedio de las Ys
    double x[31];       //Valores de x
    double y[31];       //Valores de y
    
    int i = 0;

    if ( p_fileX.is_open() ) {
        while ( !p_fileX.eof() && !p_fileY.eof() ) {
            
            p_fileX >> x[i];
                
            p_fileY >> y[i];
            
            cout << x[i] << ", " << y[i] << endl;
            
            X += x[i];
            Y += y[i];
            XY += x[i] * y[i];
            X2 += x[i] * x[i];
            n += 1.0;
            i++;
        }
        
        a1 = ( n * XY - X * Y ) / ( n * X2 - X * X );
        a0 = Y / n - a1 * X / n;
        cout << "y = (" << a0 << ") + (" << a1 << ")x" << endl;
    }
    p_fileX.close();
    p_fileY.close();
    
    yprom = Y / n;
    double st = 0.0;    //suma total de cuadrados alrededor de la media
    double sr = 0.0;    //suma de cuadrados de residuos, alrededor dela linea de regresion
    double Sxy = 0.0;   //Error de estandard de estimacion
    double r = 0.0;     //Coeficiente de correlacion
    
    //Calcular Sr y St
    for ( int j = 0; j < n; j++ ) {
        sr += pow (  ( y[j] - a0 - a1 * x[j] ), 2 );
        st += pow ( ( y[j] - yprom ), 2 );
    }
    
    //VAraicion estndar St / n-1
    //Coeficiente de Variancion c.v = desviacion estantar / Ypromedio
    
    //Calcular Sxy
    Sxy = sqrt( sr / (n - 2) );
    
    //Calcular coeficiente de correlacion r
    r = sqrt ( ( st - sr ) / st );
    
    //Print
    //determinacion es r al cuadrado
    cout << "Sr: " << sr << "\tSt: " << st << endl;
    cout << "Error estandar: " << Sxy << "\tCorrelacion(r) :" << r << endl;
    
    return 0;
}


Modelo Exponencial

Codigo en c++


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

int main(){
    ifstream p_fileX;
    ifstream p_fileY;
    p_fileX.open("Data/Xdata.dat");
    p_fileY.open("Data/Ydata.dat");
    
        double XY = 0.0, X = 0.0, Y = 0.0, X2 = 0.0, n = 0.0;
    double a0, a1, ALPHA, BETA;      //Coeficiente para la fucion de la recta
    double yprom;       //Promedio de las Ys
    double x[31];       //Valores de x
    double y[31];       //Valores de y
    
    int i = 0;

    if ( p_fileX.is_open() ) {
        while ( !p_fileX.eof() && !p_fileY.eof() ) {
            
            p_fileX >> x[i];
                
            p_fileY >> y[i];
            
            cout << x[i] << ", " << y[i] << endl;
            
            y[i] = log ( y[i] );
            
            X += x[i];
            Y += y[i];
            XY += x[i] * y[i];
            X2 += x[i] * x[i];
            n += 1.0;
            i++;
        }
        
        a1 = ( n * XY - X * Y ) / ( n * X2 - X * X );
        a0 = Y / n - a1 * X / n;
        
        ALPHA = exp( a0 );
        BETA = a1;
        cout << "y = " << ALPHA << " * exp^" << BETA << "x" << endl;
    }
    p_fileX.close();
    p_fileY.close();
    
    yprom = Y / n;
    double st = 0.0;    //suma total de cuadrados alrededor de la media
    double sr = 0.0;    //suma de cuadrados de residuos, alrededor dela linea de regresion
    double Sxy = 0.0;   //Error de estandard de estimacion
    double r = 0.0;     //Coeficiente de correlacion
    
    //Calcular Sr y St
    for ( int j = 0; j < n; j++ ) {
        sr += pow ( exp ( y[j] ) - ALPHA * exp ( BETA * x[j] ) , 2 );
        st += pow ( exp ( y[j] ) - yprom, 2 );
    }
    
    //VAraicion estndar St / n-1
    //Coeficiente de Variancion c.v = desviacion estantar / Ypromedio
    
    //Calcular Sxy
    Sxy = sqrt( sr / (n - 2) );
    
    //Calcular coeficiente de correlacion r
    r = sqrt ( ( st - sr ) / st );
    
    
    //Print
    cout << "Sr: " << sr << "\tSt: " << st << endl;
    cout << "Error estandar: " << Sxy << "\tCorrelacion(r) :" << r << endl;
    
    return 0;
}


Modelo de Potencia

Codigo en c++


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

int main(){
    ifstream p_fileX;
    ifstream p_fileY;
    p_fileX.open("Data/Xdata.dat");
    p_fileY.open("Data/Ydata.dat");

    double XY = 0.0, X = 0.0, Y = 0.0, X2 = 0.0, n = 0.0;
    double a0, a1, ALPHA, BETA;      //Coeficiente para la fucion de la recta
    double yprom;       //Promedio de las Ys
    double x[31];       //Valores de x
    double y[31];       //Valores de y
    
    int i = 0;

    if ( p_fileX.is_open() ) {
        while ( !p_fileX.eof() && !p_fileY.eof() ) {
            
            p_fileX >> x[i];
                
            p_fileY >> y[i];
            
            cout << x[i] << ", " << y[i] << endl;
            
            y[i] = log10 ( y[i] );
            x[i] = log10 ( x[i] );
            
            X += x[i];
            Y += y[i];
            XY += x[i] * y[i];
            X2 += x[i] * x[i];
            n += 1.0;
            i++;
        }
        
        a1 = ( n * XY - X * Y ) / ( n * X2 - X * X );
        a0 = Y / n - a1 * X / n;
        
        ALPHA = pow( 10,  a0 );
        BETA = a1;
        cout << "y = " << ALPHA << " * x^" << BETA << endl;
    }
    p_fileX.close();
    p_fileY.close();
    
    yprom = Y / n;
    double st = 0.0;    //suma total de cuadrados alrededor de la media
    double sr = 0.0;    //suma de cuadrados de residuos, alrededor dela linea de regresion
    double Sxy = 0.0;   //Error de estandard de estimacion
    double r = 0.0;     //Coeficiente de correlacion
    
    //Calcular Sr y St
    for ( int j = 0; j < n; j++ ) {
        sr += pow ( pow ( 10, y[j] ) - ALPHA * pow ( pow ( 10, x[j]) , BETA ) , 2 );
        st += pow ( pow ( 10, y[j] ) - yprom, 2 );
    }
    
    //VAraicion estndar St / n-1
    //Coeficiente de Variancion c.v = desviacion estantar / Ypromedio
    
    //Calcular Sxy
    Sxy = sqrt( sr / (n - 2) );
    
    //Calcular coeficiente de correlacion r
    r = sqrt ( ( st - sr ) / st );
    
    
    //Print
    cout << "Sr: " << sr << "\tSt: " << st << endl;
    cout << "Error estandar: " << Sxy << "\tCorrelacion(r) :" << r << endl;
    
    return 0;
}


Ejemplos
x
y
1
400
2
100
3
25
4
625
5
1.5625


Regresion Lineal:
Y = 311.875 - 27.1875x
Error estandar: 310.184
Coeficiente de correlación: 0.158015


Modelo Exponencial:
y = 1009.53 * exp^-0.925777x
Error estandar: 348.836
Coeficiente de correlación: 0.581741


Modelo de Potencia:
Y = 484.857 * x ^ -2.13467
Error estandar: 350.141
Coeficiente de correlación: 0.582954






Año
Valor en la cuenta
1996
5000
1997
5400
1998
5800
1999
6300
2000
6800
2001
7300
2002
7900
2003
8600
2004
9300
2005
10000
2006
11000


Regresion Lineal:
y = (-1.16755e+06) + (587.273)x
Error estandar: 262.159
Correlación(r) :0.991946


Modelo Exponencial:
y = 9.06531e-65 * exp^0.0781442x
Error estándar: 54.522
Correlación(r) :0.99998


Modelo de Potencia:
y = 0 * x^156.365
Error estandar: -nan
Correlación(r) :-nan
En este caso, el modelo de potencia falla debido a que a0 (coeficiente) es muy cercano a cero, y la computadora lo reconoce como 0.






x
y
2.5
13
3.5
11
5
8.5
6
8.2
7.5
7
10
6.2
12.5
5.2
15
4.8
17.5
4.6
20
4.3


Regresion Lineal:
y = (11.5696) + (-0.43112)x
Error estandar: 1.35745
Correlación(r) :0.898747


Modelo Exponencial:
y = 12.313 * exp^-0.0595688x
Error estandar: 1.07669
Correlación(r) :0.987185


Modelo de Potencia:
y = 21.1458 * x^-0.54029
Error estandar: 0.204067    
Correlación(r) :0.999662


No hay comentarios:

Publicar un comentario