Regresion Lineal Usando R

14
Implementaci´ on de R en la generaci´ on de modelos. Ver´onicaLondo˜ no Osorio. Juan Pablo Viana Villa. ¿Qu´ e es R? R pertenece al creciente grupo de paquetes que ofrecen soluciones en el ´ambito de la estad´ ıstica computacional. R es totalmente libre y open source 1 , cuenta con una gran variedad de herramientas para la implementaci´ on de las t´ ecnicas de la estad´ ıstica cl´asica y es adem´ as un poderoso lenguaje de programaci´on similar a S 2 . R fue concebido originalmente por Robert Gentleman y Ross Ihaka del de- partamento de estad´ ıstica de la universidad de Auckland en 1993; aunque est´ a enfocado a la ense˜ nanza de la estad´ ıstica y la investigaci´ on, cuenta con una robustez que le permite competir con la mayor´ ıa de paquetes ofreci- dos comercialmente. Actualmente R es desarrollado por “R Development Core Team” y es distribuido bajo licensia GPL (general public license) como parte del proyecto GNU 3 . ¿Qu´ e ventajas ofrece R? Como la mayor´ ıa de software que incorpora su propio lenguaje de progra- maci´ on (Matlab por ejemplo), R incluye por defecto una amplia variedad de funciones, en su mayoria para el tratamiento estadistico de datos, la ob- tenci´ on de gr´ aficos y modelos. Adem´ as, se ha dejado abierta la posibilidad de crear nuevas funciones, las cuales tras pasar un proceso de revisi´ on pueden ser compartidas con la comunidad de usuarios R de manera oficial y desde el sitio del autor. R es compatible con otros lenguajes de programaci´on comunes como C\C++, S , Fortran, Phyton e incluso Java; de esta manera se permite que usuarios no familiarizados con el leguaje de R contribuyan al poyecto, incrementandose 1 Se dice del software en el que el usuario es libre de modificarlo. 2 Lenguaje de programaci´ on dise˜ nado por John Chamber de los laboratorios Bell. 3 Organizaci´ on que promueve el desarrollo de software de distribuci´ on gratuita 1

description

Algunas maneras de realizar regresión usando R

Transcript of Regresion Lineal Usando R

Page 1: Regresion Lineal Usando R

Implementacion de R en lageneracion de modelos.

Veronica Londono Osorio.

Juan Pablo Viana Villa.

¿Que es R?

R pertenece al creciente grupo de paquetes que ofrecen soluciones en el ambitode la estadıstica computacional. R es totalmente libre y open source 1 , cuentacon una gran variedad de herramientas para la implementacion de las tecnicasde la estadıstica clasica y es ademas un poderoso lenguaje de programacionsimilar a S 2.R fue concebido originalmente por Robert Gentleman y Ross Ihaka del de-partamento de estadıstica de la universidad de Auckland en 1993; aunqueesta enfocado a la ensenanza de la estadıstica y la investigacion, cuenta conuna robustez que le permite competir con la mayorıa de paquetes ofreci-dos comercialmente. Actualmente R es desarrollado por “R DevelopmentCore Team” y es distribuido bajo licensia GPL (general public license) comoparte del proyecto GNU 3.

¿Que ventajas ofrece R?

Como la mayorıa de software que incorpora su propio lenguaje de progra-macion (Matlab por ejemplo), R incluye por defecto una amplia variedadde funciones, en su mayoria para el tratamiento estadistico de datos, la ob-tencion de graficos y modelos. Ademas, se ha dejado abierta la posibilidadde crear nuevas funciones, las cuales tras pasar un proceso de revision puedenser compartidas con la comunidad de usuarios R de manera oficial y desde elsitio del autor.

R es compatible con otros lenguajes de programacion comunes como C\C++,S , Fortran, Phyton e incluso Java; de esta manera se permite que usuarios nofamiliarizados con el leguaje de R contribuyan al poyecto, incrementandose

1 Se dice del software en el que el usuario es libre de modificarlo.2 Lenguaje de programacion disenado por John Chamber de los laboratorios Bell.3 Organizacion que promueve el desarrollo de software de distribucion gratuita

1

Page 2: Regresion Lineal Usando R

ası la cantidad de recursos que amplian el directorio de funciones disponibles.Al ser un paquete de codigo abierto, R esta disponible para ser descargado demanera gratuita desde el sitio web http://www.r-project.org/, R es soportadoen sistemas basados en GNU\Linux, MacOS y Windows.

¿Como se interactua con R?

El ambiente de trabajo para R no es unico, este tambien es sujeto a modifi-caciones por parte de los usuarios, y su eleccion depende de las necesidadesindividuales. Para la programacion con R se puede usar cualquier editor detexto plano que pueda guardar archivos con diferentes extensiones, entre losmas populares estan Emacs, jEdit, Kate y notepad++. Para la manipulacionestadıstica de datos R cuenta con dos alternativas: en modo linea de coman-dos o con interfaz grafica de usuario (GUI por sus siglas en ingles). Para lossistemas Unix (Linux y macOS), R se instala por defecto en modo linea decomandos, aunque siempre es posible anadir una GUI, siendo R-Commanderla oficialmente ofrecida por el equipo de desarrollo. R-Commander viene in-stalado por defecto en sistemas Windows. La comunidad ofrece algunas GUIalternativas como RGUI, Java GUI for R, R-Excel, Cantor y Red-R.

¿Con o sin interfaz grafica?

El uso de una GUI es mas propicio para usuarios que no esten acostumbradosa los lenguajes de programacion, ademas el uso de codigo para invocar fun-ciones es casi nulo. Por otro lado, usuarios experimentados preferieren el usode linea de comando, lo que les permite tener un mayor control sobre lo quese ejecuta, ademas una GUI consume recursos extras que podrıan amplearseen calculos computacionalmente complicados.

¿Como funciona R?

El funcionamiento de R se basa en la manipilacion de objetos, es decir, Rmaneja la informacion por medio de vectores, matrices y factores4. En R esposible tambien realizar operaciones aritmeticas de una forma intuitiva y gen-eralmente haciendo uso de los sımbolos matematicos, no solo con numeros,si no tambien con variables (y arreglos), ya sea que ya se les haya asignadoun valor numerico o de manera simbolica.Cuando se instala R el paquete incluye una gran cantidad de librerıas y estas

4 Arreglo que contiene informacion, no elementos a diferencia del vector.

2

Page 3: Regresion Lineal Usando R

a su vez muchas funciones, pero como se ha mencionado, es posible obtenermuchas mas proporcionadas por colaboradores. Las librerıas extra se insta-lan mediante el comando Install.package(‘‘nombre-del-paquete’’), yse cargan o compilan mediante el comando library(nombre-del-paquete).Los archivos que requieren las nuevas librerıas, al igual que el nucleo de R , sealmacenan en servidores en todo el mundo5; el servidor a usar es indiferentey es a preferencia del usuario.Los objetos en R pueden ser agrupados en tipos , no es necesario definir untipo previamente, por ejemplo, se puede crar el vector a1.tipo1 y posteri-ormente a2.tipo1, R asumira que ambos vectores pertenecen al mismo tipoy los asociara.

¿como comenzar a usar R?

la forma de iniciar R varia dependiendo del entorno de trabajo por el que seha optado, en la mayorıa de sistemas Unix basta con tecleal “R” en consola;los usuarios Windows pueden buscarlo en la lista de programas.Los operadores y funciones 6 mas comunes usados en R son:

• Asignacion → <- (signo menor que , seguido de un guion)

• Suma → +

• Resta → -

• Multiplicacion → *

• Division → /

• Potenciacion → ^

• Seno → sin(x)

• Coseno → cos(x)

• Logaritmo (natural) → log(x)

• Logaritmo base a → loga(x)

• Exponencial → exp(x)

• Raiz cuadrada→ sqrt(x)

5 Para el caso de Colombia en el servidor de la universidad Nacional Sede Bogota6 Los argumentos deben ponerse entre parentesis.

3

Page 4: Regresion Lineal Usando R

Los datos en los vectores pueden ser introducidos de manera manual, porejemplo, para crear el vector a que contenga los elementos 1, 2, 3, 4, se escribeen R:a <- c(1, 2, 3, 4)

La funcion c() concatena los elementos en un solo objeto. c() tambienpuede ser usado para crear vectores cuyas componentes no son numericas,por ejemplo:a<- c( ‘‘x’’ , ‘‘y’’, ‘‘z’’)

genera un vector cuyas componentes son los caracteres x, y, z.Una matriz es un vector con un atributo adicional (dim) , y al mismo

tiempo es un vector numerico.Un Marco de datos se crea a partir de la funcion data. frame. Otro tipo

de objetos son las Listas; una lista se crea de manera similar a un marco dedatos con la funcion list. No existe ninguna limitacion en el tipo de objetos.

Cuando una variable no es comparada con otra variable se habla de unaSeries de tiempo. La funcion ts crea un objeto de clase ”ts” (serie de tiempo)a partir de un vector (serie de tiempo unica) o una matriz (serie multivari-ada). Las opciones que caracterizan un objeto de este tipo son: ts(data= NA, start = 1, end = numeric(0), frequency = 1, deltat = 1, ts.eps =getOption(”ts.eps”), class, names)

Resultarıa tedioso ingresar manualmente largas listas de datos, para estalabor R cuenta con la funcion read, la cual permite leer datos almacenadosen ficheros de texto plano (.txt, .dat, .temp, .80, .prv, .htm), no necesari-amente un solo vector numerico, por ejemplo el archivo archivo.dat puedecontener informacion sobre la edad de un grupo de estudiantes, su sexo ycarrera. La sintaxis para el uso de read es:a<-read.table(‘‘ruta-del-archivo/archivo.dat’’)

Cuando se ha obtenido informacion desde un archivo, esta viene contenidaen un solo arreglo, si se desea se puede separar en vectores para cada vari-able de informacion que contiene el archivo mediante el comando attach ası:attach(a)

para nuestro ejemplo se crearıan los vectores carrera, sexo y edad (dichosnombres deben ser la primera linea del archivo de texto).

Para la estadıstica descriptiva se tienen las siguientes funciones:

• Media → mean(x)

• Mediana → median(x)

• cuantiles → quantil(x)

• Varianza → var(x)

4

Page 5: Regresion Lineal Usando R

• Desviacion standard → sd(x)

• Resumen (Estadisticos basicos) → summary(x)

Para obtener algunos de los graficos mas utiles en estadıstica R incorpora lasfunciones:

• Grafica de dispersion → plot(x,y)

• Grafica de caja → boxplot(x)

• Histograma → hist (x)

• Grafico circular → pie(x)

¿Como crear mis propias funciones?

R me permite crear las funciones que se requiera a partir de la siguientesintaxis :function(arguments)expression,

donde arguments son los argumentos para la funcion separado por comas; yexpression es cualquier estructura permitida en R. por ejemplo:myfunction<-function(x) sum(x*x)

z<-1:50

y<-myfunction(z)

>42925

¿Como generar modelos Lineales?

La expresion “modelo lineal” no significa que el resultado sea siempre unalinea recta, si no que hace alusion a una forma de trabajar y a una funcionen particular.

Modelos lineales basicos.

Los modelos lineales basicos son de la forma Y = β0 +β1X; para calcular loscoeficientes β0 y β1 se emplea la funcion lm. Suponiendo que Y es la variabledependiente y X la variable independiente, se recomienda asignar la rectagenerada a una variable auxiliar, para luego mediante el comando ablinehacer que esta aparezca sobre el grafico de dispersion generado mediante elcomando plot. El comando summary muestra informacion util respecto a larecta generada.

Lo anterior se ilustra con el siguiente ejemplo:

5

Page 6: Regresion Lineal Usando R

X Y97 12.593 12.588 881 9.575 16.557 1152 10.545 928 615 1.512 111 1

Tabla 1 - Entablillado de datos.

Considere los datos mostrados en la Tabla 1, almacenados en el archivodatos.dat. El procedimiento seguido y los resultados obtenidos se ilustrana continuacion:

> datos<-read.table("datos.dat")

> attach(datos)

> x

[1] 97 93 88 81 75 57 52 45 28 15 12 11

> y

[1] 12.5 12.5 8.0 9.5 16.5 11.0 10.5 9.0 6.0 1.5 1.0 1.0

> plot(x,y)

> recta<-lm(y~x)

> summary(recta)

Call:

lm(formula = y ~ x)

Residuals:

Min 1Q Median 3Q Max

-4.5310 -1.7314 -0.9256 2.0806 5.6303

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) 1.28535 1.70226 0.755 0.467608

x 0.12779 0.02713 4.710 0.000829 ***

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.922 on 10 degrees of freedom

Multiple R-squared: 0.6893,Adjusted R-squared: 0.6582

F-statistic: 22.19 on 1 and 10 DF, p-value: 0.0008286

> abline(recta)

6

Page 7: Regresion Lineal Usando R

Grafica 1 - Modelo Lineal basico.

Para este tipo de modelos tambien es posible obtener la grafica de residuales,para el ejemplo anterior se muestran en la Grafica 2.

Grafica 2 - Residuales Modelo Lineal basico.

Modelos lineales compuestos.

La funcion lm puede ser usada para generar modelos parametricos un pocomas complejos e incluso multivariados.Para generar modelos polinomiales de la forma Y = β0+β1x+β2x

2+...+βnxn,

se emplea la sintaxis:

Y ~ X + I(X ^2) + ... + I(X^n),

7

Page 8: Regresion Lineal Usando R

donde I() cumple la funcion de permitir que se usen los operadores y fun-ciones (matematicas) ya mencionados. Con la funcion predict() es posiblehacer estimaciones usando el modelo con un nivel de significancia determi-nado para un vector X1; el resultado es una matriz que contiene en la primeracolumna los valores ajustados, en la segunda el valor inferior y en la tercerael valor por encima. La sintaxis para asignar los resultados arrojados por lafuncion predict() a una variable auxiliar es:

a<- predict(model, data.frame(x = x1),level=significancia, interval=“confidence”).

Mediante la funcion lines() se anaden lineas a un grafico de dispersiongenerado previamente. Para un modelo lineal compuesto tambien se puedengenerar los graficos de residuales.

Los conceptos y procedimientos descritos anteriormente se ilustran paraun polinomio de segundo grado usando los datos de la Tabla 1, ademas enlas Graficas 3, 4 y 5 se muestran los resultados para polinomios de quinto yseptimo grado respectivamente.

> pol2<-lm(y~x+I(x^2))

> summary(pol2)

Call:

lm(formula = y ~ x + I(x^2))

Residuals:

Min 1Q Median 3Q Max

-3.7964225 -0.4696195 0.0004541 0.5379715 4.3709565

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) -3.5324937 2.1034282 -1.679 0.12738

x 0.4085990 0.0989895 4.128 0.00257 **

I(x^2) -0.0026637 0.0009185 -2.900 0.01760 *

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.214 on 9 degrees of freedom

Multiple R-squared: 0.8394,Adjusted R-squared: 0.8037

F-statistic: 23.52 on 2 and 9 DF, p-value: 0.0002667

> a<-predict(pol2,data.frame(x=x),level=0.95, interval="confidence")

> plot(x,y)

> lines(x,a[,1]);lines(x,a[,2]); lines(x,a[,3])

8

Page 9: Regresion Lineal Usando R

Grafica 3 - Ajuste con polinomio de segundo grado.

Grafica 4 - Ajuste con polinomio de quinto grado.

Grafica 5 - Ajuste con polinomio de septimo grado.

La funcion lm() admite modelos un poco menos convencionales, por ejemplo,suponga los valores mostrados en la Tabla 2 (los cuales han sido generadosde manera aleatoria pero controlada).

9

Page 10: Regresion Lineal Usando R

X Y1 1.2

1.5 0.252 -1.18

2.5 -1.753 -1.22

3.5 0.634 0.52

4.5 1.665 -0.56

Tabla 2 - Entablillado de datos (modelo no polinomial).

Se plantea usar un modelo parametrico de la forma:

Y = β0 + β1x+ β2Sin(x) + β3Cos(x) + β4ex

Los resultados obtenidos al usar lm() se muestran en la Grafica 6, elsummary se muestra a continuacion:

lm(formula = y ~ x + I(sin(x)) + I(cos(x)) + I(exp(x)))

Residuals:

1 2 3 4 5 6 7 8

-0.11121 0.27401 -0.08080 -0.22163 -0.10658 0.66884 -0.61891 0.22223

9

-0.02594

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) -1.76950 4.65088 -0.380 0.7229

x 2.37716 2.33201 1.019 0.3657

I(sin(x)) -1.72319 1.47774 -1.166 0.3084

I(cos(x)) 4.44694 1.95477 2.275 0.0853 .

I(exp(x)) -0.09145 0.04425 -2.066 0.1077

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 lm(formula = y ~ x + I(sin(x)) + I(cos(x)) + I(exp(x)))

Residuals:

1 2 3 4 5 6 7 8

-0.11121 0.27401 -0.08080 -0.22163 -0.10658 0.66884 -0.61891 0.22223

9

-0.02594

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) -1.76950 4.65088 -0.380 0.7229

x 2.37716 2.33201 1.019 0.3657

I(sin(x)) -1.72319 1.47774 -1.166 0.3084

I(cos(x)) 4.44694 1.95477 2.275 0.0853 .

I(exp(x)) -0.09145 0.04425 -2.066 0.1077

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5087 on 4 degrees of freedom

Multiple R-squared: 0.9081,Adjusted R-squared: 0.8161

F-statistic: 9.876 on 4 and 4 DF, p-value: 0.02381

Residual standard error: 0.5087 on 4 degrees of freedom

Multiple R-squared: 0.9081,Adjusted R-squared: 0.8161

F-statistic: 9.876 on 4 and 4 DF, p-value: 0.02381

10

Page 11: Regresion Lineal Usando R

Grafica 6 - Modelo no polinomial

¿Que es un spline?

Un spline es una curva continua sobre un intervalo y definida a tramos porpolinomios. Los splines son muy usados en las regresiones debido a queaproximan muy bien y su calculo no requiere mucho poder computacional.Algunos postulados del calculo numerico sugieren que es conveniente y sufi-ciente usar splines de grado tres.

¿Como generar splines con R?

Para generar un spline con R debe cargarse la librerıa splines; dicha librerıa seusa en conjunto con la funcion lm() para calcular los coeficientes del modelo.splines incorpora algunas funciones, entre las mas usadas estan bs() (basicsplines) y ns() (natural splines), por defecto generan polinomios de gradotres y los nodos pueden ser especificados de forma manual. El uso de lalibrerıa splines se ilustra a continuacion, los datos usados son los mostradosen la Tabla 1.

> splines1<-lm(y~bs(x,knots=c(28 , 75 , 93)))

> summary(splines1)

Call:

lm(formula = y ~ bs(x, knots = c(28, 75, 93)))

Residuals:

1 2 3 4 5 6 7

-1.963e-16 5.125e-01 -1.254e+00 -1.082e+00 3.327e+00 -1.877e+00 -7.420e-01

8 9 10 11 12

3.817e-01 1.621e+00 -1.569e+00 -1.150e-01 7.977e-01

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) 0.2023 1.7728 0.114 0.91358

bs(x, knots = c(28, 75, 93))1 5.5830 5.2847 1.056 0.33911

bs(x, knots = c(28, 75, 93))2 -0.3728 6.1689 -0.060 0.95415

bs(x, knots = c(28, 75, 93))3 23.9122 7.0125 3.410 0.01904 *

bs(x, knots = c(28, 75, 93))4 4.6944 3.9230 1.197 0.28509

bs(x, knots = c(28, 75, 93))5 14.9843 4.5178 3.317 0.02108 *

bs(x, knots = c(28, 75, 93))6 12.2977 2.8196 4.361 0.00728 **

11

Page 12: Regresion Lineal Usando R

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.193 on 5 degrees of freedom

Multiple R-squared: 0.9125,Adjusted R-squared: 0.8075

F-statistic: 8.692 on 6 and 5 DF, p-value: 0.01568

> plot(x,y)

> ajuste<-predict(splines1,data.frame(x=x1), value=0.95,interval="confidence" )

> lines(x1,ajuste[,1]);lines(x1,ajuste[,2]);lines(x1,ajuste[,3])

El ajuste obtenido y su intervalo con una significancia de 0.95 se muestraen la Grafica 7.

Grafica 7 - Ajuste con splines.

¿como generar modelos no lienales?

R incorpora la funcion nls, la cual a partir de los mınimos cuadrados da unaestimacion de los modelos no lineales.Los supuestos que se deben tener en cuenta en un modelo no lineal son:

• Correcto significado o valores para la funcion f.

• La variacion de homogeneidad (homocedasticidad).

• Distribucion normal, errores mediciones.

• los errores de mediciones son independientes entre sı.

La sintaxis de estos modelos no lineales es :nls (formula, data, start, control, algorithm, trace, subset,

weights, na.action, model, lower, upper, ...)

• En formula se coloca el modelo no lineal.

12

Page 13: Regresion Lineal Usando R

• En data especificamos el data frame que contiene las variables a mode-lar en el caso de que trabajemos con un data frame.

• En start se colocan las estimaciones de inicio o partida.

• En control se coloca una list opcional para parametros de control.

• En algorithm cadena de caracteres que especifica el algoritmo que seutilizara, el algoritmo por defecto es un algoritmo de gauss-newton.

• Trace: Valor logico que indica el trace de los efectos de iteracion.

• Subset:vector opcional que especifica un subconjuntode observacionesque se utilizan en el proceso de adaptacion.

• Weights: vector numerico opcional de pesos.

Estos argumentos son los mas generales y si se desea poner en funcion deotros parametros se va a la ayuda de R(?lm)

¿Como hacer estimacion no-parametrica?

En ocasiones la estimacion parametrica no resulta util o poco practica, enestos casos puede optarse por la estimacion no-parametrica. R incluye lalibrerıa modreg (modern regression) especializada metodos de aproximacionpor polinomios locales y otros metodos de la estadıstica moderna.

La librerıa incluye las siguientes funciones (extraido de la ayuda):

• ksmooth → Kernel Regression Smoother

• loess → Local Polynomial Regression Fitting

• loess.control → Set Parameters for Loess

• loess.smooth → Simple Smoothing via Loess

• plot.ppr → Plot Ridge Functions for Projection Pursuit

• predict.loess → Predict Loess Curve or Surface

• predict.smooth.spline →Predict from Smoothing Spline Fit

• scatter.smooth → Scatter Plot with Smooth Curve Fitted by Loess

• smooth.spline → Fit a Smoothing Spline

13

Page 14: Regresion Lineal Usando R

• supsmu → Friedmans’s SuperSmoother

Usando la funcion loess.smooth() para los datos de la Tabla 1 se obtiene:

> plot(x,y)

> lines(loess.smooth(x,y))

Grafica 8 - Uso de la funcion Smooth().

Referencias.

• http://www.stat.washington.edu/quinn/classes/536/S/Rexamp1.html -A sample regression session. (15 de Septiembre 2011).

• http://www.r-project.org/ - The R Project for Statistical Computing.(15 de Septiembre 2011).

• http://data.princeton.edu/R/linearModels.html - Introducing R. (15de Septiembre 2011).

• http://finzi.psych.upenn.edu/R/library/tseries/html/arma.html - Fit ARMAModels to Time Series. (18 de Septiembre 2011).

• http://analisisydecision.es/manual-curso-introduccion-de-r-capitulo-10-funciones-graficas-en-regresion-lineal/ - Manual. Curso introduccion deR. Capıtulo 10: Funciones graficas en regresion lineal. (18 de Septiem-bre 2011).

• Ihaka R. Gentleman R. 1996. R: a language for data analysis and graph-ics. Journal of Computational and Graphical Statistics 5: 299–314.

• S programming William N. Venables, Brian D. Ripley. springer 2000.New York.

14