library("dplyr")
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Ejercicios 7 - Regresión lineal simple

Para esto se utilizará el dataset ToothGrowth, que nos brinda información sobre las celulas que propician el crecimiento de los dientes en 60 cerdos de Guinea. Para trabajar en este documento, solo se ocuparan los datos de len y dose.

datos = ToothGrowth
datos = select(datos,len,dose)
datos
##     len dose
## 1   4.2  0.5
## 2  11.5  0.5
## 3   7.3  0.5
## 4   5.8  0.5
## 5   6.4  0.5
## 6  10.0  0.5
## 7  11.2  0.5
## 8  11.2  0.5
## 9   5.2  0.5
## 10  7.0  0.5
## 11 16.5  1.0
## 12 16.5  1.0
## 13 15.2  1.0
## 14 17.3  1.0
## 15 22.5  1.0
## 16 17.3  1.0
## 17 13.6  1.0
## 18 14.5  1.0
## 19 18.8  1.0
## 20 15.5  1.0
## 21 23.6  2.0
## 22 18.5  2.0
## 23 33.9  2.0
## 24 25.5  2.0
## 25 26.4  2.0
## 26 32.5  2.0
## 27 26.7  2.0
## 28 21.5  2.0
## 29 23.3  2.0
## 30 29.5  2.0
## 31 15.2  0.5
## 32 21.5  0.5
## 33 17.6  0.5
## 34  9.7  0.5
## 35 14.5  0.5
## 36 10.0  0.5
## 37  8.2  0.5
## 38  9.4  0.5
## 39 16.5  0.5
## 40  9.7  0.5
## 41 19.7  1.0
## 42 23.3  1.0
## 43 23.6  1.0
## 44 26.4  1.0
## 45 20.0  1.0
## 46 25.2  1.0
## 47 25.8  1.0
## 48 21.2  1.0
## 49 14.5  1.0
## 50 27.3  1.0
## 51 25.5  2.0
## 52 26.4  2.0
## 53 22.4  2.0
## 54 24.5  2.0
## 55 24.8  2.0
## 56 30.9  2.0
## 57 26.4  2.0
## 58 27.3  2.0
## 59 29.4  2.0
## 60 23.0  2.0

Los datos contenidos en el dataset son los siguientes: - Len: indica el largo del diente - Supp: Tipo de suplemento dado al animal (VC u OJ) - Dose: Dosis en miligramos/día

1. Ejemplo de regresión lineal simple

plot(len~dose,data=datos)

Se utiliza la función lm para ajustar modelos lineales:

lm.fit = lm(len~dose,data=datos)
summary(lm.fit)
## 
## Call:
## lm(formula = len ~ dose, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.4496 -2.7406 -0.7452  2.8344 10.1139 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   7.4225     1.2601    5.89 2.06e-07 ***
## dose          9.7636     0.9525   10.25 1.23e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.601 on 58 degrees of freedom
## Multiple R-squared:  0.6443, Adjusted R-squared:  0.6382 
## F-statistic: 105.1 on 1 and 58 DF,  p-value: 1.233e-14

Ahora al grafico se le agrega una línea a un gráfico, con la pendiente e intercepto

plot(len~dose,data=datos)
abline(7.4225,9.7636,col='red')

2. Predicción de 5 nuevos registros

Se hace una prediccion de 5 registros de dosis diferentes a los ya contenidos en el dataset, donde se obtiene su respectivo largo de diente.

set.seed(321)
pw<-c(0.7,1.2,1.7,2.4,3.7)

predict.lm(lm.fit,data.frame(dose=pw))
##        1        2        3        4        5 
## 14.25700 19.13879 24.02057 30.85507 43.54771
# Predicciones obtenidas
#  dose       len
#   0.7     14.25700
#   1.2     19.13879
#   1.7     24.02057
#   2.4     30.85507
#   3.7     44.11731

Se añaden las predicciones al dataset y se hace el nuevo grafico

# Para esto se añade una fila nueva con rbind
newDatos = datos
newDatos = rbind(newDatos,c(14.25700, 0.7))
newDatos = rbind(newDatos,c(19.13879, 1.2))
newDatos = rbind(newDatos,c(24.02057, 1.7))
newDatos = rbind(newDatos,c(30.85507, 2.4))
newDatos = rbind(newDatos,c(44.11731 , 3.7))

plot(len~dose,data=newDatos) # Nuevo grafico

Ajuste modelo lineal con la funcion lm

lm.fit = lm(len~dose,data=newDatos)
summary(lm.fit)
## 
## Call:
## lm(formula = len ~ dose, data = newDatos)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.493 -2.685 -0.593  2.515 10.115 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   7.3765     1.1086   6.654 7.99e-09 ***
## dose          9.8082     0.7861  12.477  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.415 on 63 degrees of freedom
## Multiple R-squared:  0.7119, Adjusted R-squared:  0.7073 
## F-statistic: 155.7 on 1 and 63 DF,  p-value: < 2.2e-16

Al nuevo grafico se le agrega la pendiente con el intercepto obtenido

plot(len~dose,data=newDatos)
abline(7.3765,9.8082,col='purple')

  • Con los datos predecidos agregados y al realizar el gráfico con su respectivo ajuste no se ve ningún cambio significativo ademas de los nuevos coeficientes, sin embargo, el comportamiento es similar, por lo que se puede decir que la predicción está bien hecha.

3. Multiplicación por 100 de un punto

Se tomara un valor de largo de dientes al azar y se multiplicará por 100

newDatos2 = newDatos # Se tiene un total de 65 columnas

set.seed(120)
pos = sample(1:65,1) 

newDatos2$len[pos] = newDatos2$len[pos] * 100 # Se multiplica por 100 el valor

Se calcula la regresión lineal

lm.fit = lm(len~dose,data=newDatos2)
summary(lm.fit)
## 
## Call:
## lm(formula = len ~ dose, data = newDatos2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -198.37  -87.42  -24.09    1.07 2523.18 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)   -31.03      81.23  -0.382    0.704
## dose           73.92      57.60   1.283    0.204
## 
## Residual standard error: 323.5 on 63 degrees of freedom
## Multiple R-squared:  0.02548,    Adjusted R-squared:  0.01001 
## F-statistic: 1.647 on 1 and 63 DF,  p-value: 0.2041
plot(len~dose,data=newDatos2)
abline(-34.80,77.25,col='blue')

Al multiplicar un valor al azar por 100, el gráfico de la regresión a diferencia de los anteriores se ‘distorsiona’, ya que un coeficiente se encuentra muy disperso a diferencia de los demás, provocando que la recta tenga una forma que no represente las posiciones de los puntos en el gráfico. Si todos los valores se multiplican por 100 el gráfico se mantendría igual visualmente, pero a una escala mucho mayor para los valores de la variable len