Vous êtes sur la page 1sur 5

Pgina 1 de 5

Primeros pasos con regresin no lineal (nls) con R


http://analisisydecision.es/primeros-pasos-con-regresion-no-lineal-nls-con-r/

21/08/2014Formacin, Modelos, Monogrficos, Rnlsrvaquerizo

La regresin no lineal se da cuando tenemos que estimar Y a partir de una funcin del
tipo Y=f(X,Beta) + Error donde Beta son Beta1, Beta2,, Beta n. Unos datos X e Y se
relacionan mediante una funcin no lineal respecto a unos parmetros Beta
desconocidos. Y cmo obtenemos estos Beta desconocidos, a travs de mnimos
cuadrados o bien con otros mtodos como mxima verosilimilitud. Este clculo llevar
asociada su inferencia estadstica habitual. La funcin que asocia los pares de datos
(x1,y1), (x2, y2),, (yn, xn) ser una funcin conocida. Por eso esta tcnica es muy
utilizada en ciencias qumicas, geodinmica, donde ya se conoce la relacin que hay
entre las variables independientes y la variable dependiente pero es necesario realizar
modelos con los pares de datos disponibles de cara a obtener estimaciones.

Para la realizacin de este monogrfico con R vamos a emplear el conjunto de datos


Thurber Son datos de un estudio NIST de movilidad de electrones en semiconductores
la variable respuesta es la movilidad del electrn y la variable regresora es el logaritmo
de la densidad. El modelo es:

Nuestra variable est relacionada con su regresora por un modelo racional con siete
parmetros Beta1, Beta2,, Beta7 y cbicas. Comenzamos el trabajo con los datos en
R:

1 y = c(80.574 ,84.248 ,87.264 ,87.195 ,89.076 ,89.608 ,89.868 ,


2 90.101 ,92.405 ,95.854 ,100.696 ,101.06 ,401.672 ,390.724 ,
3 567.534 ,635.316 ,733.054 ,759.087 ,894.206 ,990.785 ,1090.109 ,
1080.914 ,1122.643 ,1178.351 ,1260.531 ,1273.514 ,1288.339 ,
4 1327.543 ,1353.863 ,1414.509 ,1425.208 ,1421.384 ,1442.962 ,
5 1464.35 ,1468.705 ,1447.894 ,1457.628)
6
7 x = c(-3.067 ,-2.981 ,-2.921 ,-2.912 ,-2.84 ,-2.797 ,
8 -2.702 ,-2.699 ,-2.633 ,-2.481 ,-2.363 ,-2.322 ,-1.501 ,-1.46 ,
9 -1.274 ,-1.212 ,-1.1 ,-1.046 ,-0.915 ,-0.714 ,-0.566 ,-0.545 ,
-0.4 ,-0.309 ,-0.109 ,-0.103 ,0.01 ,0.119 ,0.377 ,0.79 ,0.963 ,
10 1.006 ,1.115 ,1.572 ,1.841 ,2.047 ,2.2)
11
12 #Representacin de los datos
13 plot(y ~ x,xlab="Log de Densidad",
14 ylab="Mobilidad de los electrones")
Pgina 2 de 5

15
16

Metemos los datos directamente desde la web a R. Realizamos una representacin


grfica de los datos y se aprecia la inexistencia de relacin lineal. Se nos indica que
existe relacin entre las variables mediante la funcin antes indicada. Introduzcamos en
R la funcin:

1 foo = function(x,b1,b2,b3,b4,b5,b6,b7){
2 (b1 + b2*x + b3*x^2 + b4*x^3)/
3 (1 + b5*x + b6*x^2 + b7*x^3)}
El trabajo con R le vamos a llevar a cabo con la funcin nls del paquete stats. Pero
antes de crear un modelo de regresin no lineal tenemos que asignar unos valores
iniciales a los parmetros Beta de nuestra ecuacin. La regresin no lineal es un
proceso iterativo. Se parte de unos parmetros Beta iniciales, se modeliza y mediante
un proceso de optimizacin numrica se aproximan los parmetros seleccionados a los
valores ptimos. Si empleamos el algoritmo de Gauss-Newton partiramos de la mnima
suma de cuadrados de los residuos (modelo lineal) y tomaramos esta funcin como
funcin a minimizar algo que es posible debido a que al menos una derivada depende
de uno de los parmetros Beta (condicin de no linealidad). El proceso busca mnimos
locales de la funcin y que posteriormente habr de comprobar si son mnimos globales
hasta que el proceso llegara a converger (o no). Para obtener los valores iniciales es
necesario conocer los datos. En nuestro caso tenemos una divisin y 7 parmetros.
Vamos a observar la grfica con los datos. Para x=0 el valor de y ha de ser muy
prximo a 1200, luego ese es un buen inicio para b1. No podemos tener valores
negativos, luego los parmetros que multiplican tanto a x como a x^3 no deberan ser
los ms altos. Adems tenemos una divisin y luego los parmetros que estn en el
denominador no deberan ser muy altos ya que la funcin ha de ser creciente. Si
comenzamos a ejecutar:
Pgina 3 de 5

1 plot(y ~ x,xlab="Log de Densidad",


2 ylab="Mobilidad de los electrones",main="Prueba 1")
3 curve(foo(x,1200,100,100,1,0.1,1,0.1),add=T,col="red")
Vemos que hasta 0 la curva no tiene mal aspecto, pero a desde ese punto la forma no
es adecuada. Los parmetros del denominador pueden ser ms bajos:

1 plot(y ~ x,xlab="Log de Densidad",


2 ylab="Mobilidad de los electrones",main="Prueba 2")
3 curve(foo(x,1200,100,100,1,-0.1,0.1,-0.1),add=T,col="blue")
Realicemos un primer modelo con estas especificaciones:

1 m1start=list(b1=1200,b2=100,b3=100,b4=1,b5=-0.1,b6=0.1,b7=-0.1)
Obtenemos el error Error en nlsModel(formula, mf, start, wts) : singular gradient matrix
at initial parameter estimates Este error se produce debido a que los valores iniciales
no son correctos para poder realizar el algoritmo inicial ya que no es posible encontrar
un primer gradiente. Podramos ir realizando diversas pruebas para encontrar los
valores iniciales e incluso elaborar una parrilla de datos. Tambin podemos emplear la
librera nls2:

1 #install.packages("nls2")
2 library(nls2)
3 m1<- nls2(y ~ foo(x,b1,b2,b3,b4,b5,b6,b7),
4 start=c(b1=1200,b2=100,b3=100,b4=1,b5=-0.1,b6=0.1,b7=-0.1),
control = nls.control(warnOnly = TRUE))
5
Con esta librera nls2 estamos empleando el algoritmo brute force que se emplea
para encontrar los valores iniciales. Es importante destacar que no se emplea para
realizar el modelo, slo para resolver la problemtica de los valores iniciales. En este
ejemplo concreto se sabe que los valores iniciales son:

1
2 B1=1000
B2=1000
3 B3=400
4 B4=40
5 B5=0.7
6 B6=0.3
7 B7=0.03
8
m.nls = nls(y ~ foo(x,b1,b2,b3,b4,b5,b6,b7),
9 start = c(b1 = 1000, b2 = 1000, b3 = 400, b4 = 40,
10 b5 = 0.7, b6 = 0.3, b7 = 0.03),trace=T)
11
En este caso ya hemos obtenido resultados. Con summary(m.nls) la salida obtenida es:

Formula: y ~ foo(x, b1, b2, b3, b4, b5, b6, b7)


Pgina 4 de 5

Parameters:
Estimate Std. Error t value Pr(>|t|)
b1 1.288e+03 4.665e+00 276.141 < 2e-16 ***
b2 1.491e+03 3.957e+01 37.682 < 2e-16 ***
b3 5.832e+02 2.870e+01 20.323 < 2e-16 ***
b4 7.542e+01 5.567e+00 13.546 2.55e-14 ***
b5 9.663e-01 3.133e-02 30.840 < 2e-16 ***
b6 3.980e-01 1.499e-02 26.559 < 2e-16 ***
b7 4.973e-02 6.584e-03 7.553 2.02e-08 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1

Residual standard error: 13.71 on 30 degrees of freedom

Number of iterations to convergence: 28


Achieved convergence tolerance: 8.36e-06

El algoritmo ha necesitado de 28 iteracciones, vemos los estimadores de los


parmetros. Ahora es necesario que realicemos un diagnstico del modelo.
Comenzamos por graficar el resultado del modelo:

1 plot(y ~ x,xlab="Log de Densidad",


2 ylab="Mobilidad de los electrones",main="Ajuste del modelo")
3 lines(x,fitted(m.nls),col="blue")

Grficamente el modelo ajusta bien. Podemos ver la suma del cuadrado de los errores
con la funcin deviance:
Pgina 5 de 5

1 deviance(m.nls)
2 [1] 5642.708
Tambin es necesario analizar si el modelo cumple las hiptesis de ser
estadsticamente vlido con el test F, homocedasticidad, distribucin normal de los
errores y errores independientes. El test F lo podemos realizar con un test ANOVA con
el ajuste por mnimos cuadrados frente a nuestro modelo de regresin no lineal. El
cdigo R que podemos emplear para realizar estas tareas es:

#Anova para contraste de falta de ajuste

1
2 m.lm&lt;- lm(y~x)
3 anova(m.nls,m.lm)
4
5 #Independencia de los residuos
6 plot(fitted(m.nls),residuals(m.nls),
xlab="Valores ajustados",ylab="Residuos")
7 abline(a=0,b=0,col="blue")
8
9 #Test de normalidad de los residuos
10 qqnorm(residuals(m.nls))
11 qqline(residuals(m.nls))
shapiro.test(residuals(m.nls))
12
13 #Test de Leneve
14 library(car)
15 levene.test(y,as.factor(x))
16
17 #Intervalos de confianza
18 confint(m.nls)
19
No entramos en ms detalles para no alargar la entrada. Pero ya disponemos de las
herramientas de R para comenzar a trabajar con este tipo de modelos. Tambin
recomiendo ver las posibilidades de la librera nlstools. Saludos.