Saltar al contenido principal
MedCalc
Enviar una copia en PDF de esta página a:
(Su dirección de correo electrónico no se añadirá a una lista de distribución)
working

Ejemplo de script: Regresión múltiple mediante aritmética matricial

Este ejemplo muestra la formulación matricial de regresión múltiple e ilustra cómo calcularla utilizando el script MedCalc.

En general, la formulación matricial de la regresión múltiple es $ Y = Xb + e $ donde Y es un vector que contiene los datos dependientes, X es una matriz que contiene los datos x independientes y e es un vector que contiene los residuos.

En el ejemplo, utilizaremos los siguientes datos de muestra:

Script de MedCalc:

<data>
varx1  varx2  vary
2.3    2.0    11.2
5.1    2.1    18.8
6.9    4.3    31.6
9.0    5.8    4.2
12.0   3.2    5.1
18.3   6.2    1.1
21.6   8.0    1.6
</data> 

Vector de variable dependiente Y

Y es una matriz (n,1) que contiene los valores y de la variable dependiente:

$$ Y=\begin{bmatrix}
y_1 \\
y_2 \\
\vdots \\
y_{n} \end{bmatrix}$$

Script de MedCalc:

y={vary};  // Creates a matrix y from the data variable vary

Matriz aumentada X

X es una matriz (n,k+1) que contiene una columna de 1 y columnas de las distintas variables x:

$$ X=\begin{bmatrix}
1 & x_{11}&x_{12}&\vdots&x_{1k}\\
1 & x_{21}&x_{22}&\vdots&x_{2k}\\
1 & \vdots&\vdots&\vdots&\vdots\\
1 & x_{n1}&x_{n2}&\vdots&x_{nk}\\
\end{bmatrix} $$

Script de MedCalc:

x={varx1,varx2};  // Creates a matrix x from the data variables varx1 and varx2
// counts
n = nrow(x);
k = ncol(x);
// add a column with 1s for the constant 
// gives the augmented matrix xa
c=ones(n,1);
xa=cbind(c,x);

Vector de coeficientes de regresión b

b es una matriz (k+1,1) que contiene los coeficientes de regresión

$$ b = \begin{bmatrix}
b_0 \\
b_1 \\
\vdots \\
b_{k} \end{bmatrix} $$

Vector de residuos e

e es una matriz (n,1) que contiene los residuos

$$ e=\begin{bmatrix}
e_1 \\
e_2 \\
\vdots \\
e_{n} \end{bmatrix}$$

Computación b

$$ b = (X^{'}X)^{-1}X^{'}Y $$

Script de MedCalc:

xt=transpose(xa);
xtx=xt*xa;
xtxI=inv(xtx);
b=xtxI*xt*y;

Cálculo de valores predichos

La matriz (n,1) $ \hat{Y} $ contiene los valores predichos:

$$ \hat{Y} = Xb $$

Script de MedCalc:

ypred=xa*b;

Cálculo de los residuos e

$$ e = Y - \hat{Y} $$

Script de MedCalc:

e=y-ypred;

Cálculo del coeficiente de determinación R 2

$$ R^2 = y^{'}Xb(y^{'}y)^{-1} $$

usando

$$ y = Y - \bar{Y} $$

Script de MedCalc:

ya=y-avg(y);
yat=transpose(ya);
r=yat*xa*b*inv(yat*y);

Suma total de cuadrados

$$ Total = y^{'}y $$

Script de MedCalc:

sstotal=yat*y;

Sumas residuales de cuadrados

$$ SSresid = e^{'}e $$

Script de MedCalc:

et=transpose(e);
ssresid=et*e;

Regresión suma de cuadrados

$$ SSregres = SStotal - SSresid $$

Script de MedCalc:

ssregres=sstotal-ssresid;

Covarianza y errores estándar de los coeficientes de regresión

$$ C = \frac{SSresid}{nk-1} (X^{'}X)^{-1} $$

Las raíces cuadradas de las diagonales de C son los errores estándar de los coeficientes de regresión.

Script de MedCalc:

C=ssresid/(n-k-1);
C=C*inv(transpose(xa)*xa);
C=sqrt(C);
se=diag(C);

Calcular valores T y valores F

Script de MedCalc:

T=b&/se;  // elementwise division
pT=TDIST(T,n-k-1);
F=(ssregres/k)/(ssresid/(n-k-1));
pF=FDIST(f,k,n-k-1);

Residuos de prueba para distribución normal

Script de MedCalc:

pR=testnorm(shapwilk,e);

Crear informe

Script de MedCalc:

print   'Coefficient of determination R²: ',r:4;  println ;
println ;
//
print 'Coefficients, Standard errors, T, P ' ;  println ;
print   'constant: ',b[1]:4:8,se[1]:4:8,T[1]:4:8,pT[1]:4:8; println ;
print   'b1: ',b[2]:4:8,se[2]:4:8,T[2]:4:8,pT[2]:4:8; println ;
print   'b2: ',b[3]:4:8,se[3]:4:8,T[3]:4:8,pT[3]:4:8; println ;
println ;
//  
print   'Analysis of variance' ;  println ;
print   'SStotal: ',sstotal:4:8;  println ;
print   'SSregres: ',ssregres:4:8;  println ;
print   'SSresid: ',ssresid:4:8;  println ;
println ;
//
print   'F-ratio: ',F:4:8;  println ;
print   'P  : ',pF:4:8;  println ;
println ;
//
print   'Test residuals for normal distribution P = ',pR:4;  println ;

La salida del script

Este script crea la siguiente salida:

Coefficient of determination R²: 0.4069262

Coefficients, Standard errors, T, P 
constant:  19.6395  9.6496  2.0353  0.1115
b1:  -1.2889  1.2139 -1.0618  0.3482
b2:   1.0459  3.7869  0.2762  0.7961

Analysis of variance
SStotal: 751.0086
SSregres: 305.6051
SSresid: 445.4035

F-ratio:   1.3723
P  :   0.3517

Test residuals for normal distribution P = 0.4909

El script completo

// regional settings
$decimalsymbol= '.' ;
$listseparator= ',' ;
//
cls ;
clear  data;
clear  mem;
<data> 
varx1 varx2   vary
2.3   2.0     11.2
5.1   2.1     18.8
6.9   4.3     31.6
9.0   5.8     4.2
12.0  3.2     5.1
18.3  6.2     1.1
21.6  8.0    1.6
</data> 
// create matrices from data
y={vary};
x={varx1,varx2}; 
// counts
n = nrow(x);
k = ncol(x);
// add a column with 1s for the constant 
// gives the augmented matrix xa
c=ones(n,1);
xa=cbind(c,x);
// b = (X’X)^-1 X’ Y
xt=transpose(xa);
xtx=xt*xa;
xtxI=inv(xtx);
// calculate coefficients b
b=xtxI*xt*y;
// calculate predicted values
ypred=xa*b;
// calculate residuals
e=y-ypred;
//Coefficient of determination R²
ya=y-avg(y);
yat=transpose(ya);
r=yat*xa*b*inv(yat*y);
// Total sum of squares
sstotal=yat*y;
// Residual sum of squares;
et=transpose(e);
ssresid=et*e;
// Regression sum of squares
ssregres=sstotal-ssresid;
// Covariance and 
// Standard Errors of regression coefficients
C=ssresid/(n-k-1);
C=C*inv(transpose(xa)*xa);
C=sqrt(C);
se=diag(C);
// T-values and F-value;
T=b&/se;  // elementwise division
pT=TDIST(T,n-k-1);
F=(ssregres/k)/(ssresid/(n-k-1));
pF=FDIST(f,k,n-k-1);
// Test residuals for normal distribution
pR=testnorm(shapwilk,e);
// report
print   'Coefficient of determination R²: ',r:4;  println ;
println ;
//
print   'Coefficients, Standard errors, T, P ' ;  println ;
print   'constant: ',b[1]:4:8,se[1]:4:8,T[1]:4:8,pT[1]:4:8; println ;
print   'b1:       ',b[2]:4:8,se[2]:4:8,T[2]:4:8,pT[2]:4:8; println ;
print   'b2:       ',b[3]:4:8,se[3]:4:8,T[3]:4:8,pT[3]:4:8; println ;
println ;
//  
print   'Analysis of variance' ;  println ;
print   'SStotal : ',sstotal:4:8;  println ;
print   'SSregres: ',ssregres:4:8;  println ;
print   'SSresid : ',ssresid:4:8;  println ;
println ;
//
print   'F-ratio: ',F:4:8;  println ;
print   'P      : ',pF:4:8;  println ;
println ;
//
print   'Test residuals for normal distribution P = ',pR:4;  println ;

Véase también