#### Asignamos una libreria para leer los datos guadados en la memoria, en este caso son datos dados por el profesor. Utilizamos el siguiente comando.####
data <- read.csv("test_linear_regression.csv")
############ Nuestras variables a utilizar son: dim,str,summary y head. estas guardarƔn los datos dados.
"dim" (data)
## [1] 300 2
"str" (data)
## 'data.frame': 300 obs. of 2 variables:
## $ x: int 77 21 22 20 36 15 62 95 20 5 ...
## $ y: num 79.8 23.2 25.6 17.9 41.8 ...
"summary" (data)
## x y
## Min. : 0.00 Min. : -3.468
## 1st Qu.: 27.00 1st Qu.: 25.677
## Median : 53.00 Median : 52.171
## Mean : 50.94 Mean : 51.205
## 3rd Qu.: 73.00 3rd Qu.: 74.303
## Max. :100.00 Max. :105.592
"head" (data)
## x y
## 1 77 79.775152
## 2 21 23.177279
## 3 22 25.609262
## 4 20 17.857388
## 5 36 41.849864
## 6 15 9.805235
############ Comparamos los datos con los valores nulos de nuestro grupo de datos, para eso utilizamos el siguiente comando:
sapply(data, function(x)(sum(is.na(x))))
## x y
## 0 0
########### Insertamos el siguiente comando insertamos un diagrama de dispersión para saber como estÔn distribuidos nuestros datos en un eje coordenado x,y. Para esto utilizamos el siguiente comando:
library(ggplot2)
ggplot(data, aes(x=x, y=y)) + geom_point()

### Comprobamos si hay de valores atipicos.
### El siguiente comando nos sirve para dividir el area del grafico en dos espacios para hacer la comparación.
par(mfrow=c(1, 2))
### Al ser datos con componentes en X y Y tendremos lineas atipicas dentro del diagrama:
boxplot(data$x, main="X", sub=paste("Diagrama de caja", boxplot.stats(data$s)$out)) ### Para X respectivamente
boxplot(data$y, main="Y", sub=paste("Diagrama de caja", boxplot.stats(data$y)$out)) ### para Y respectivamente

###Con el siguiente comando colocamos un posible modelo de regresión para nuestros datos
library(ggcorrplot)
###Para ello:
### Creamos datos de entrenamiento y prueba
cor(data[,c("x","y")], use="complete")
## x y
## x 1.0000000 0.9945453
## y 0.9945453 1.0000000
### Establecemos una semilla para guardar y reproducir los resultados del muestreo aleatorio de todos los datos:
set.seed(100)
### Con este comando estblecemos indices para los datos de entrenamiento.
trainingRowIndex <- sample(1:nrow(data), 0.8*nrow(data))
### Datos de entrenamiento:
training <- data[trainingRowIndex, ]
### Datos de prueba:
test <- data[-trainingRowIndex, ]
### Guardamos nuestros datos en los siguientes comando.
"dim" (training)
## [1] 240 2
"dim" (test)
## [1] 60 2
### Los datos de entrenamiento:
Model1 <- lm(y~x, data=training)
summary(Model1)
##
## Call:
## lm(formula = y ~ x, data = training)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.7494 -1.9605 -0.2619 1.9625 7.8877
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.371984 0.392800 -0.947 0.345
## x 1.014567 0.006651 152.543 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.983 on 238 degrees of freedom
## Multiple R-squared: 0.9899, Adjusted R-squared: 0.9898
## F-statistic: 2.327e+04 on 1 and 238 DF, p-value: < 2.2e-16
ggplot()+geom_point(aes(x=training$x,y=training$y),colour='blue')+
geom_line(aes(x=training$x,y=predict(Model1,newdata=training)),
colour='white')+
ggtitle('X vs Y(Training set)')+
xlab('X')+
ylab('Y')

AIC(Model1)
## [1] 1209.711
BIC(Model1)
## [1] 1220.153
### Con el siguiente comando hacemos una predicción sobre los datos de prueba:
ypred <- predict(Model1, test)
### Calculamos que tan precisa fué la predicción de las tasas de error:
actual_preds <- data.frame(cbind(actual=test$y, predición=ypred))
correlation_accuracy <- cor(actual_preds)
correlation_accuracy
## actual predición
## actual 1.000000 0.992782
## predición 0.992782 1.000000
head(actual_preds)
## actual predición
## 6 9.805235 14.846527
## 10 8.746748 4.700853
## 17 66.958069 65.574895
## 18 16.635080 13.831959
## 21 92.119063 89.924512
## 22 46.913877 51.370952
### Graficamos la predicción vs la real
ggplot(test, aes(x = x, y = y)) +
geom_segment(aes(xend = x, yend = ypred)) +
geom_point() +
geom_point(aes(y = ypred), shape = 1)

### Calculamos la precisión minima y maxima para lo anterior
min_max_accuracy <- mean(apply(actual_preds, 1, min) / apply(actual_preds, 1, max))
min_max_accuracy*100
## [1] 79.94807
mape <- mean(abs((actual_preds$predicteds - actual_preds$actual))/actual_preds$actual)
mape*100
## [1] NaN
### Hacemos un diagnostico para la regresión lineal
###Para la media de los residuos es 0
mean(Model1$residuals)
## [1] -2.193663e-17
###Normalidad de los residuos
par(mfrow=c(2,2))
plot(Model1)

### Pruebas estadistica de Heterocedasticidad-Breusch Pagan
###Prueba de Breuch Pagan:
lmtest::bptest(Model1)
##
## studentized Breusch-Pagan test
##
## data: Model1
## BP = 0.045773, df = 1, p-value = 0.8306
car::ncvTest(Model1)
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 0.05178837, Df = 1, p = 0.81998
### Prueba de Durbin-Watson
lmtest::dwtest(Model1)
##
## Durbin-Watson test
##
## data: Model1
## DW = 2.034, p-value = 0.6047
## alternative hypothesis: true autocorrelation is greater than 0