#### 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