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
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
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')
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')
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