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