Para esta actividad se utilizará el conjunto de datos “Cars”
cars <- datasets::cars
plot(speed~dist,data = cars)
Ahora, utilizamos la funcion lm para ajustar un modelo lineal de los datos del dataset:
lm.fit <- lm(speed~dist,data = cars)
lm.fit
##
## Call:
## lm(formula = speed ~ dist, data = cars)
##
## Coefficients:
## (Intercept) dist
## 8.2839 0.1656
summary(lm.fit)
##
## Call:
## lm(formula = speed ~ dist, data = cars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.5293 -2.1550 0.3615 2.4377 6.4179
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.28391 0.87438 9.474 1.44e-12 ***
## dist 0.16557 0.01749 9.464 1.49e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.156 on 48 degrees of freedom
## Multiple R-squared: 0.6511, Adjusted R-squared: 0.6438
## F-statistic: 89.57 on 1 and 48 DF, p-value: 1.49e-12
plot(speed~dist,data = cars);abline(8.3,0.2,col="blue")
Se puede intentar predecir a partir del modelo lineal los valores con la función predict.lm
predict.lm(lm.fit,data.frame(dist=40))
## 1
## 14.90661
También podemos predecir algunos puntos
datos<-c(20,40,60,80,100)
predict.lm(lm.fit,data.frame(dist=datos))
## 1 2 3 4 5
## 11.59526 14.90661 18.21796 21.52931 24.84066
Utilizando los datos anteriores,
dist <- c(20,40,60,80,100)
speed <- c(11.59526,14.90661,18.21796,21.52931,24.84066)
new_data <- data.frame(speed=speed, dist=dist)
new_dataset <- rbind(cars,new_data)
new_dataset
## speed dist
## 1 4.00000 2
## 2 4.00000 10
## 3 7.00000 4
## 4 7.00000 22
## 5 8.00000 16
## 6 9.00000 10
## 7 10.00000 18
## 8 10.00000 26
## 9 10.00000 34
## 10 11.00000 17
## 11 11.00000 28
## 12 12.00000 14
## 13 12.00000 20
## 14 12.00000 24
## 15 12.00000 28
## 16 13.00000 26
## 17 13.00000 34
## 18 13.00000 34
## 19 13.00000 46
## 20 14.00000 26
## 21 14.00000 36
## 22 14.00000 60
## 23 14.00000 80
## 24 15.00000 20
## 25 15.00000 26
## 26 15.00000 54
## 27 16.00000 32
## 28 16.00000 40
## 29 17.00000 32
## 30 17.00000 40
## 31 17.00000 50
## 32 18.00000 42
## 33 18.00000 56
## 34 18.00000 76
## 35 18.00000 84
## 36 19.00000 36
## 37 19.00000 46
## 38 19.00000 68
## 39 20.00000 32
## 40 20.00000 48
## 41 20.00000 52
## 42 20.00000 56
## 43 20.00000 64
## 44 22.00000 66
## 45 23.00000 54
## 46 24.00000 70
## 47 24.00000 92
## 48 24.00000 93
## 49 24.00000 120
## 50 25.00000 85
## 51 11.59526 20
## 52 14.90661 40
## 53 18.21796 60
## 54 21.52931 80
## 55 24.84066 100
Se calcula nuevamente la regresión lineal
lm.fit2 <- lm(speed~dist,data=new_dataset)
lm.fit2
##
## Call:
## lm(formula = speed ~ dist, data = new_dataset)
##
## Coefficients:
## (Intercept) dist
## 8.2839 0.1656
summary(lm.fit2)
##
## Call:
## lm(formula = speed ~ dist, data = new_dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.529 -1.933 0.000 2.415 6.418
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.28391 0.79773 10.38 2.21e-14 ***
## dist 0.16557 0.01544 10.73 6.84e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.003 on 53 degrees of freedom
## Multiple R-squared: 0.6846, Adjusted R-squared: 0.6787
## F-statistic: 115.1 on 1 and 53 DF, p-value: 6.842e-15
Se obtuvieron coeficientes similares, donde los valores más alejados de los originales son mínimos.
Ahora que sucedería si agregamos un dato externo, correspondiente a un dato real multiplicado por 100
conDatoExterno <- data.frame(speed = 15*100, dist = 26*100)
datasetConDato <- rbind(cars,conDatoExterno)
datasetConDato
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
## 7 10 18
## 8 10 26
## 9 10 34
## 10 11 17
## 11 11 28
## 12 12 14
## 13 12 20
## 14 12 24
## 15 12 28
## 16 13 26
## 17 13 34
## 18 13 34
## 19 13 46
## 20 14 26
## 21 14 36
## 22 14 60
## 23 14 80
## 24 15 20
## 25 15 26
## 26 15 54
## 27 16 32
## 28 16 40
## 29 17 32
## 30 17 40
## 31 17 50
## 32 18 42
## 33 18 56
## 34 18 76
## 35 18 84
## 36 19 36
## 37 19 46
## 38 19 68
## 39 20 32
## 40 20 48
## 41 20 52
## 42 20 56
## 43 20 64
## 44 22 66
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
## 51 1500 2600
Con este dato que se encuentra bastante alejado a los datos ya existentes, calculamos la regresión lineal:
lm.fit3 <- lm(speed~dist,data=datasetConDato)
lm.fit3
##
## Call:
## lm(formula = speed ~ dist, data = datasetConDato)
##
## Coefficients:
## (Intercept) dist
## -9.3589 0.5785
summary(lm.fit3)
##
## Call:
## lm(formula = speed ~ dist, data = datasetConDato)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.06 -5.93 2.69 7.71 14.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -9.358904 1.609064 -5.816 4.48e-07 ***
## dist 0.578502 0.004379 132.098 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11.12 on 49 degrees of freedom
## Multiple R-squared: 0.9972, Adjusted R-squared: 0.9971
## F-statistic: 1.745e+04 on 1 and 49 DF, p-value: < 2.2e-16