Lo primero que hacemos cada una de las clases es revisar el cargue de nuestros datos;
data <- read.csv("Clase 8.csv", sep=";")
str(data)
## 'data.frame': 352 obs. of 10 variables:
## $ Marca : chr "A Speyside Distillery" "Ainslie's" "Angel's Envy" "Asyla" ...
## $ Pais : chr "Scotland" "Scotland" "United States" "Scotland" ...
## $ Whiskies : int 11 32 23 11 12 364 11 12 1071 62 ...
## $ Votos : int 10 12 13 7 4 249 11 3 908 26 ...
## $ Puntuacion: num 86.7 82.3 83.4 81.8 81 ...
## $ Categoria : chr "C" "D" "D" "D" ...
## $ Sabor : int 8 5 3 3 9 6 3 7 8 7 ...
## $ Color : int 6 6 6 2 10 2 7 9 5 9 ...
## $ Maltas : int 8 8 1 8 8 1 9 1 1 9 ...
## $ Compra : int 0 0 1 0 0 1 0 1 1 0 ...
El día de hoy seguiremos trabajando con la base de datos de las diferentes características de un grupo de whiskies de diferentes países del mundo. La variable que le interesa estimar es el puntaje del whisky. El link para acceder a los datos es el siguiente: https://www.dropbox.com/s/pt6g6luafdyrx9k/Clase%208.csv?dl=0.
El paquete caret (classification and regression training, Kuhn (2016)) incluye una serie de funciones que facilitan el uso de decenas de métodos complejos de clasificación y regresión. Utilizar este paquete en lugar de las funciones originales de los métodos presenta dos ventajas:
*Es más fácil poner en práctica algunos procedimientos usuales en problemas de clasificación. Por ejemplo, hay funciones específicas para dividir la muestra en datos de entrenamiento y datos de test o para ajustar parámetros mediante validación cruzada.
Con este paquete nos centraremos en el uso para problemas de regresión y clasificación limitadas, pero son más de 200 modelos diferentes que tendrán a su disposición.
Para ello lo primero que haremos será realizar una partición en los datos en dos grupos, train y test. Esto nos permite entrenar el modelo y, además, probar si funciona. La proporción no es exacta y su elección no suele ser aleatoria, por lo que se aconseja una proporción de 80/20. La función que usaremos es createDataPartition():
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
trainIndex <- createDataPartition(data$Puntuacion, p=0.8, list=F)
Ahora que tenemos los índices podemos crear nuestros nuevos data frames al usar este índice para hacer la división:
train <- data[trainIndex,]
test <- data[-trainIndex,]
Ahora deberemos definir el resampling para la evaluación del modelo. La finalidad última de un modelo es predecir la variable respuesta en observaciones futuras o en observaciones que el modelo no ha “visto” antes. Para conseguir una estimación más certera, y antes de recurrir al conjunto de test, se pueden emplear estrategias de validación basadas en resampling. caret incorpora los métodos boot, boot632, optimism_boot, boot_all, cv, repeatedcv, LOOCV, LGOCV. Cada uno funciona internamente de forma distinta, pero todos ellos se basan en la idea de ajustar y evaluar el modelo múltiples veces con distintos subconjuntos creados a partir de los datos de entrenamiento, obteniendo en cada repetición una estimación del error. El promedio de todas las estimaciones tiende a converger en el valor real del error de test.
Para especificar el tipo de validación, así como el número de repeticiones, se crea un control de entrenamiento mediante la función trainControl(), que se pasa al argumento trControl de la función train(). A efectos prácticos, cuando se aplican métodos de resampling hay que tener en cuenta dos cosas: el coste computacional que implica ajustar múltiples veces un modelo, cada vez con un subconjunto de datos distinto, y la reproducibilidad en la creación de las particiones. caret permite paralelizar el proceso para que sea más rápido y establecer semillas para asegurar que cada resampling o partición pueda crearse de nuevo con exactamente las mismas observaciones.
fitControl <- trainControl( method = "cv", number = 10, savePredictions = 'final', classProbs = FALSE)
Lo siguiente será definir las variables que utilizaremos como predictoras y la variable a predecir:
predictors<-c("Sabor", "Color","Maltas")
outcomeName<-'Puntuacion'
Ahora solo nos falta correr el modelo utilizando la función train(). Lo que definirá qué modelo utilizaremos será el parámetro de method ya que la implementación es igual para todos los modelos en caret:
model1 <- train(train[,predictors], train[,outcomeName], method='lm', trControl = fitControl)
summary(model1)
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -79.835 -2.084 1.231 3.274 8.635
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 83.59304 1.50626 55.497 <2e-16 ***
## Sabor -0.02705 0.16635 -0.163 0.871
## Color -0.12969 0.15648 -0.829 0.408
## Maltas 0.07947 0.11809 0.673 0.502
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.473 on 280 degrees of freedom
## Multiple R-squared: 0.003972, Adjusted R-squared: -0.006699
## F-statistic: 0.3722 on 3 and 280 DF, p-value: 0.7731
Una vez hemos obtenido los valores en el modelo entrenado podemos probar si los resultados son funcionales usando nuestro grupo de prueba. Para ello utilizaremos la función predict(), la cual nos permite para aplicar un modelo a un nuevo conjunto de datos
test$predicho <- predict(model1, test[,predictors])
plot(test$Puntuacion, test$predicho)
t.test(test$Puntuacion, test$predicho)
##
## Welch Two Sample t-test
##
## data: test$Puntuacion and test$predicho
## t = 0.29597, df = 67.929, p-value = 0.7682
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.9821891 1.3242820
## sample estimates:
## mean of x mean of y
## 83.16706 82.99601
Ahora, lo interesante que tiene caret es que tiene mayor variedad, incluyendo backward and forward estimation, e incluso variaciones más robustas. En este link podrán encontrar todas las posibles variaciones: https://topepo.github.io/caret/train-models-by-tag.html#linear-regression
Ahora, ,miramemos un modelo más de regresión. la regresión logística es un tipo de análisis de regresión utilizado para predecir el resultado de una variable categórica en función de las variables independientes o predictoras. Es útil para modelar la probabilidad de un evento ocurriendo como función de otros factores.
La existencia de una relación significativa entre una variable cualitativa con dos niveles y una variable continua se puede estudiar mediante otros test estadísticos tales como t-test o ANOVA (un ANOVA de dos grupos es equivalente al t-test). Sin embargo, la regresión logística permite además calcular la probabilidad de que la variable dependiente pertenezca a cada una de las dos categorías en función del valor que adquiera la variable independiente. Supóngase que se quiere estudiar la relación entre los niveles de colesterol y los ataques de corazón. Para ello, se mide el colesterol de un grupo de personas y durante los siguientes 20 años se monitoriza que individuos han sufrido un ataque. Un t-test entre los niveles de colesterol de las personas que han sufrido ataque vs las que no lo han sufrido permitiría contrastar la hipótesis de que el colesterol y los ataques al corazón están asociados. Si además se desea conocer la probabilidad de que una persona con un determinado nivel de colesterol sufra un infarto en los próximos 20 años, o poder conocer cuánto tiene que reducir el colesterol un paciente para no superar un 50% de probabilidad de padecer un infarto en los próximos 20 años, se tiene que recurrir a la regresión logística.
La característica central de un modelo logístico es la siguiente: relaciona la probabilidad de un resultado con una función exponencial de una variable predictora. Al modelar la probabilidad de un resultado, un modelo logístico logra dos cosas. Primero, modela más directamente lo que nos interesa, que es una probabilidad o proporción, como la probabilidad de que un cliente determinado compre un producto o la proporción esperada de un segmento que responderá a una promoción. En segundo lugar, limita el modelo al rango apropiado para una proporción, que es [0, 1]. Un modelo lineal básico como se genera con lm() no tiene tal límite y podría estimar una probabilidad sin sentido como 1.05 o -0.04. La ecuación de la función logística es:
Figura 1: Función logística
Veamos un ejemplo de lo que hace la función aplicando la probabilidad logística con plogis():
plogis( exp (0) / (exp (0) + 1))
## [1] 0.6224593
plogis(-Inf)
## [1] 0
plogis ( -0.2)
## [1] 0.450166
Otra opción es utilizar la función sigmoidal, que se representa así:
\[\begin{equation} \text{función sigmoide} = \sigma(x) = \dfrac{1}{1 + e^{-x}} \tag{1} \end{equation}\]
Para valores de x muy grandes positivos, el valor de e^{-x} es aproximadamente 0 por lo que el valor de la función sigmoide es 1. Para valores de x muy grandes negativos, el valor e^{-x} tiende a infinito por lo que el valor de la función sigmoide es 0.
El análisis de regresión logística se enmarca en el conjunto de Modelos Lineales Generalizados (GLM por sus siglas en inglés). Las probabilidades que describen el posible resultado de un único ensayo se modelan, como una función de variables explicativas, utilizando una función logística. Por lo tanto, los modelos lineales generalizados se pueden utilizar para modelar recuentos de datos (como el número de compras) o intervalos de tiempo (como el tiempo que se pasa en un sitio web) o variables binarias (por ejemplo, compró / no compró). La característica común de todos los modelos GLM es que relacionan predictores distribuidos normalmente con un resultado no normal mediante una función conocida como enlace. Esto significa que pueden adaptarse a modelos para muchas distribuciones diferentes utilizando un marco único y coherente.
La Regresión Logística Simple, desarrollada por David Cox en 1958, es un método de regresión que permite estimar la probabilidad de una variable cualitativa binaria en función de una variable cuantitativa. Una de las principales aplicaciones de la regresión logística es la de clasificación binaria, en el que las observaciones se clasifican en un grupo u otro dependiendo del valor que tome la variable empleada como predictor. Por ejemplo, clasificar a un individuo desconocido como hombre o mujer en función del tamaño de la mandíbula.
Es importante tener en cuenta que, aunque la regresión logística permite clasificar, se trata de un modelo de regresión que modela el logaritmo de la probabilidad de pertenecer a cada grupo. La asignación final se hace en función de las probabilidades predichas.
Para correr el modelo utilizaremos la misma sintaxis de la función lm() pero en este caso en su versión generalizada, como comentamos antes. Para lograrlo utilizaremos la función glm() utilizando como parámetro del modelo binomial:
reg1 <- glm(Compra ~ Puntuacion, data=data, family = "binomial")
Una vez que hemos corrido nuestro modelo realizaremos la respectiva verificación utilizando la función summary():
summary(reg1)
##
## Call:
## glm(formula = Compra ~ Puntuacion, family = "binomial", data = data)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.1723 -1.0773 -0.9369 1.2327 3.1819
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.23401 2.13904 -2.447 0.0144 *
## Puntuacion 0.05942 0.02559 2.322 0.0202 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 480.85 on 351 degrees of freedom
## Residual deviance: 474.26 on 350 degrees of freedom
## AIC: 478.26
##
## Number of Fisher Scoring iterations: 4
¿Qué encontramos en este modelo? Primero, vemos la significancia de cada una de las variables. Para determinar la significancia individual de cada uno de los predictores introducidos en un modelo de regresión logística se emplea el estadístico Z y el test Wald chi-test.
Ahora, ¿qué significan los coeficientes de esta regresión? Para saber cómo funcionan estos. ¿Qué significa un coeficiente de 0.05? Podemos usarlo para calcular la asociación de los puntajes obtenidos con el factor de la compra del vino, examinando la proporción de éxito contra la proporción de no éxito. Para esto calcularemos los valores de la asociación con la función exp() y la función coef() sobre los coeficientes de la regresión:
exp(coef(reg1))
## (Intercept) Puntuacion
## 0.005332111 1.061223352
Esto muestra que el efecto de Puntuación es una razón de probabilidades estimada de 1.06, lo que significa que los jugadores tienen 1.06 veces más probabilidades de ser comprado cuando tienen una alta puntuación. Otra forma de pensar en esto es que la puntuación aumenta la probabilidad de jugar en un 6,1%.
A diferencia de los modelos de regresión lineal, en los modelos logísticos no existe un equivalente a R^2 que determine exactamente la varianza explicada por el modelo. Se han desarrollado diferentes métodos conocidos como pseudoR^2 que intentan aproximarse al concepto de R^2 pero que, aunque su rango oscila entre 0 y 1, no se pueden considerar equivalentes.
A la hora de evaluar la validez y calidad de un modelo de regresión logística, se analiza tanto el modelo en su conjunto como los predictores que lo forman. Se considera que el modelo es útil si es capaz de mostrar una mejora explicando las observaciones respecto al modelo nulo (sin predictores). El test Likelihood ratio calcula la significancia de la diferencia de residuos entre el modelo de interés y el modelo nulo. El estadístico sigue una distribución chi-cuadrado con grados de libertad equivalentes a la diferencia de grados de libertad de los dos modelos. Para ello utilizaremos la función anova():
anova(reg1, test = "Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: Compra
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 351 480.85
## Puntuacion 1 6.5863 350 474.26 0.01028 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En este caso vemos que, comparado con el modelo nulo, la regresión es significativa.
La regresión logística múltiple es una extensión de la regresión logística simple. Se basa en los mismos principios que la regresión logística simple (explicados anteriormente) pero ampliando el número de predictores. Los predictores pueden ser tanto continuos como categóricos (similar a la regresión lineal múltiple):
reg2 <- glm(Compra ~ Puntuacion + Maltas, data=data, family = "binomial")
summary(reg2)
##
## Call:
## glm(formula = Compra ~ Puntuacion + Maltas, family = "binomial",
## data = data)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.6654 -0.3113 -0.1637 0.3657 3.3551
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.08581 3.42471 -1.485 0.1375
## Puntuacion 0.10184 0.04178 2.437 0.0148 *
## Maltas -0.84440 0.07837 -10.774 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 480.85 on 351 degrees of freedom
## Residual deviance: 190.19 on 349 degrees of freedom
## AIC: 196.19
##
## Number of Fisher Scoring iterations: 6
Podemos hacer las mismas revisiones sobre los betas para entender su comportamiento:
exp(coef(reg2))
## (Intercept) Puntuacion Maltas
## 0.006183847 1.107202022 0.429815863
Además, podemos evaluar el modelo usando anova():
anova(reg2, test = "Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: Compra
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 351 480.85
## Puntuacion 1 6.586 350 474.26 0.01028 *
## Maltas 1 284.073 349 190.19 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Otra forma de obtener esta “significancia” es a través del test LR. El test Likelihood ratio calcula la significancia de la diferencia de residuos entre el modelo de interés y el modelo nulo. El estadístico sigue una distribución chi-cuadrado con grados de libertad equivalentes a la diferencia de grados de libertad de los dos modelos. La forma de calcularlo es la siguiente:
dif_residuos <- reg2$null.deviance - reg2$deviance
df <- reg2$df.null - reg2$df.residual
p_value <- pchisq(q = dif_residuos,df = df, lower.tail = FALSE)
p_value
## [1] 7.657451e-64
En este caso el modelo en su conjunto es significativo.
Una de las principales aplicaciones de un modelo de regresión logística es clasificar la variable cualitativa en función de valor que tome el predictor. Para conseguir esta clasificación, es necesario establecer un threshold de probabilidad a partir de la cual se considera que la variable pertenece a uno de los niveles.Para ello haremos una conversión en nuestros datos predichos usando la función ifelse():
predicciones <- ifelse(test = reg2$fitted.values > 0.5, yes = 1, no = 0)
t1 <- table(data$Compra, predicciones)
t1
## predicciones
## 0 1
## 0 182 19
## 1 19 132
Esta tabla nos da información muy general sobre las variables a predecir, y se denomina matriz de confusión.
Figura 2: Matriz de confusión
Como podrán apreciar en la tabla, cada una de las posiciones que se obtienen en la matriz de confusión tiene un significado. Lo que nos gustaría saber son ciertas medidas que podemos calcular con la matriz. Estos serán nuestros indicadores de éxito en nuestra regresión logística:
Figura 3: Medidas de desempeño
Estas 4 medidas son solo algunas de aquellas que podremos calcular. Sin embargo, este análisis lo llevaremos a cabo cuando realicemos modelos de clasificación. Revisemos algunas de ellas:
182/(182+19)
## [1] 0.9054726
132/(132+19)
## [1] 0.8741722
(182+132)/352
## [1] 0.8920455
Esto nos muestra que nuestra regresión es bastante robusta y la podemos utilizar para predecir el resultado de una variable categórica binaria
Si queremos aplicar el paquete caret solamente haremos unas pequeñas variaciones. Primero hacemos nuestra partición:
trainIndex1 <- createDataPartition(data$Compra, p=0.8, list=F)
train1 <- data[trainIndex1,]
test1 <- data[-trainIndex1,]
Para ahorrar algo de tiempo, en esta ocasión usaremos los mismos parámetros de control que vimos al principio, por lo que ahora escogeremos las variables predictoras y predicha:
predictors1<-c("Puntuacion","Maltas")
outcomeName1<-'Compra'
Ahora deberemos correr el modelo modificando el método para que sea una regresión logística:
train1$Compra <- as.factor(train1$Compra)
model2 <- train(train1[,predictors1], train1[,outcomeName1], method='glm', trControl = fitControl)
summary(model2)
##
## Call:
## NULL
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.6770 -0.3616 -0.2022 0.3758 3.3434
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.10305 3.93875 -1.296 0.1951
## Puntuacion 0.10068 0.04788 2.103 0.0355 *
## Maltas -0.78432 0.07990 -9.816 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 385.24 on 281 degrees of freedom
## Residual deviance: 163.20 on 279 degrees of freedom
## AIC: 169.2
##
## Number of Fisher Scoring iterations: 6
Una vez hemos obtenido los valores en el modelo entrenado podemos probar si los resultados son funcionales usando nuestro grupo de prueba. Una vez más utilizaremos la función predict(), la cual nos permite para aplicar un modelo a un nuevo conjunto de datos
test1$Compra <- as.factor(test1$Compra)
test1$predicho <- predict(model2, test1[,predictors1])
plot(test1$Compra, test1$predicho)
confusionMatrix(test1$Compra, test1$predicho)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 34 6
## 1 1 29
##
## Accuracy : 0.9
## 95% CI : (0.8048, 0.9588)
## No Information Rate : 0.5
## P-Value [Acc > NIR] : 1.138e-12
##
## Kappa : 0.8
##
## Mcnemar's Test P-Value : 0.1306
##
## Sensitivity : 0.9714
## Specificity : 0.8286
## Pos Pred Value : 0.8500
## Neg Pred Value : 0.9667
## Prevalence : 0.5000
## Detection Rate : 0.4857
## Detection Prevalence : 0.5714
## Balanced Accuracy : 0.9000
##
## 'Positive' Class : 0
##
El análisis de regresión implica identificar relaciones entre variables. Dado un conjunto de variables independientes o predictoras, nuestro objetivo es predecir una variable dependiente o objetivo. En el análisis de regresión, la variable objetivo es numérica y las variables predictoras pueden ser numéricas, categóricas u ordinales.
Como vimos en las sesiones anteriores tenemos a nuestra disposición una serie de regresiones que pueden realizar amplias estimaciones sobre el comportamiento de nuestros dataframe, sin embargo en algunas ocasiones se aprecia que una regresión no retorna una aproximación satisfactoria. Algunas veces se debe a que los datos tienen un comportamiento difícil de predecir, sin embargo en otras ocasiones se aprecia que tienen un comportamiento diferente a los comunes pero con un patrón. En dichos casos se recomienda usar una regresión polinomica.
La regresión polinómica es un caso especial de regresión lineal en la que la relación entre los datos x e y son modelados usando un polinomio en vez de una linea. Puede ser usada cuando la relación entre las variables es no lineal. En el caso de R es considerada un caso especial de regresión linear múltiple al efectuarse con el comando lm().
Para hacer una regresión polinómica se usa la función lm , sin embargo se debe tener una consideración adicional. Como el modelo que buscamos solo requiere de una variable, se deben realizar ajustes sobre los parámetros que nos interesan, dichos ajustes pueden tener dos enfoques, los cuales analizaremos acá.
Si intentamos usar en R nuestro parámetro de interés al cuadrado, cubo o una potencia diferente, haciendo la operación DENTRO DE LA FUNCIÓN, R no efectuará el cambio, por lo que estaremos suministrándole la misma variable más de una vez.
En este caso, si queremos establecer directamente el grado y los términos que deben aparecer en nuestra regresión, podemos crear un grupo de variables auxiliares que sean la variable de interés al cuadrado, cubo o potencia que se esté trabajando.
var1 <- (data$Votos)^2
reg3 <- lm(Puntuacion ~ var1, data = data)
summary(reg3)
##
## Call:
## lm(formula = Puntuacion ~ var1, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -79.825 -2.338 1.139 3.066 10.415
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.282e+01 3.333e-01 248.530 < 2e-16 ***
## var1 2.123e-06 8.019e-07 2.647 0.00848 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.101 on 350 degrees of freedom
## Multiple R-squared: 0.01963, Adjusted R-squared: 0.01683
## F-statistic: 7.009 on 1 and 350 DF, p-value: 0.008479
Ahora comparemos con la versión dentro del código:
reg4 <- lm(Puntuacion ~ (Votos) ^ 2, data=data)
summary(reg4)
##
## Call:
## lm(formula = Puntuacion ~ (Votos)^2, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -79.377 -2.050 0.878 3.053 10.843
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 82.371819 0.353513 233.010 < 2e-16 ***
## Votos 0.005047 0.001173 4.303 2.19e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.005 on 350 degrees of freedom
## Multiple R-squared: 0.05025, Adjusted R-squared: 0.04753
## F-statistic: 18.52 on 1 and 350 DF, p-value: 2.189e-05
La creación de dichas variables auxiliares depende de que potencia se desee trabajar para el modelo. Una vez creadas las variables auxiliares se usa el comando lm con normalidad, siendo el primer parametro los valores y, anexando la variable original como segundo parámetro y las demás variables como parámetros adicionales haciendo uso del operador ‘+’.
reg3 <- lm(Puntuacion ~ Votos + var1, data = data)
summary(reg3)
##
## Call:
## lm(formula = Puntuacion ~ Votos + var1, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -78.954 -1.873 0.581 2.961 11.238
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.194e+01 3.806e-01 215.301 < 2e-16 ***
## Votos 1.217e-02 2.736e-03 4.446 1.18e-05 ***
## var1 -5.289e-06 1.841e-06 -2.873 0.00431 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.944 on 349 degrees of freedom
## Multiple R-squared: 0.07219, Adjusted R-squared: 0.06687
## F-statistic: 13.58 on 2 and 349 DF, p-value: 2.097e-06
var2 <- (data$Votos)^(1/2)
reg3 <- lm(Puntuacion ~ Votos + var2, data = data)
summary(reg3)
##
## Call:
## lm(formula = Puntuacion ~ Votos + var2, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -77.293 -1.722 0.413 2.674 12.287
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 79.736766 0.630279 126.510 < 2e-16 ***
## Votos -0.010314 0.003288 -3.137 0.00185 **
## var2 0.566875 0.113882 4.978 1.01e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.811 on 349 degrees of freedom
## Multiple R-squared: 0.1132, Adjusted R-squared: 0.1081
## F-statistic: 22.28 on 2 and 349 DF, p-value: 7.854e-10
var3 <- (data$Votos)^(3)
reg3 <- lm(Puntuacion ~ Votos + var3, data = data)
summary(reg3)
##
## Call:
## lm(formula = Puntuacion ~ Votos + var3, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -79.122 -1.876 0.661 3.035 11.085
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.211e+01 3.684e-01 222.895 < 2e-16 ***
## Votos 8.481e-03 1.878e-03 4.517 8.61e-06 ***
## var3 -1.614e-09 6.920e-10 -2.332 0.0203 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.968 on 349 degrees of freedom
## Multiple R-squared: 0.06482, Adjusted R-squared: 0.05946
## F-statistic: 12.1 on 2 and 349 DF, p-value: 8.34e-06
En este ajuste lo que hacemos es decirle a R mediante la función I() y poly() que queremos realizar una regresión polinomica.
Usamos I() para incluir un término específico en un modelo, por ejemplo, I(x^3) indica que queremos solo el término X^{3}:
reg3 <- lm(Puntuacion ~ Votos + I(Votos^3), data = data)
summary(reg3)
##
## Call:
## lm(formula = Puntuacion ~ Votos + I(Votos^3), data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -79.122 -1.876 0.661 3.035 11.085
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.211e+01 3.684e-01 222.895 < 2e-16 ***
## Votos 8.481e-03 1.878e-03 4.517 8.61e-06 ***
## I(Votos^3) -1.614e-09 6.920e-10 -2.332 0.0203 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.968 on 349 degrees of freedom
## Multiple R-squared: 0.06482, Adjusted R-squared: 0.05946
## F-statistic: 12.1 on 2 and 349 DF, p-value: 8.34e-06
La función poly recibe 3 parametros: el primero es la variable de interés, la segunda es el grado del polinomio a crear y la tercera es “raw”, si raw está asignada con un valor verdadero la regresión se llevará a cabo con polinomios ajustados, si se configura como falsa se hará uso de polinomios ortogonales, proceso que resulta útil en espacios de trabajo diferentes al nuestro.
Si deseamos usar poly() podemos hacerlo dentro de nuestro comando de regresión, se ingresa como segundo parámetro directamente:
reg4 <- lm(Puntuacion ~ poly(Votos, 2) , data=data)
summary(reg4)
##
## Call:
## lm(formula = Puntuacion ~ poly(Votos, 2), data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -78.954 -1.873 0.581 2.961 11.238
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 83.0175 0.3168 262.036 < 2e-16 ***
## poly(Votos, 2)1 25.8413 5.9440 4.347 1.81e-05 ***
## poly(Votos, 2)2 -17.0776 5.9440 -2.873 0.00431 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.944 on 349 degrees of freedom
## Multiple R-squared: 0.07219, Adjusted R-squared: 0.06687
## F-statistic: 13.58 on 2 and 349 DF, p-value: 2.097e-06