Taller general No. 2

Descripción del Problema.

Con la intención de comparar el desempeño de dos clases de discos duros (0: SDD, 1: HDD). Este desempeño es medido a través de la variable Y: tiempo de respuesta del disco (segundos), la cual se relaciona, posiblemente bajo una dependencia no lineal, de X: la carga del sistema (Número de consultas por minuto). Se han realizado múltiples ensayos bajo ambas configuraciones y bajo variación de la carga del sistema. Los resultados se presentan en la siguiente tabla:

I.Represente gráficamente la relación entre el tiempo de respuesta y la carga de trabajo diferenciando los dos tipos de disco duro. ¿Se evidencia una relación lineal? Mida la fuerza de esta relación para ambos tipos de disco realizando los test correspondientes test de correlación en cada caso.

Como siempre, iniciamos estableciendo un directorio de trabajo, importando las librerias a utilizar,junto con la base de datos a nuestro Rstudio.

#1. Directorio de trabajo
wd="F:/Taller General 2"
setwd(wd)
#2. Librerias
library(ggplot2)
library(car)
## Loading required package: carData

Relacionamos la base de datos a la variable de datos, con la función name vemos las variables contenidas, además con la función str vemos todos los detalles internos del objeto.

#3. (punto 1)

datos <- read.table("DatosTaller.txt", header=TRUE, dec=".")
names(datos)
## [1] "Conf"   "Carga"  "Tiempo"
str(datos)
## 'data.frame':    25 obs. of  3 variables:
##  $ Conf  : int  1 0 1 0 1 1 0 0 0 1 ...
##  $ Carga : num  1 2 2.4 3.1 4 4.3 5.8 6.6 7.5 8 ...
##  $ Tiempo: num  0.9 0.3 2 0.8 2.7 2.6 2.5 3.2 3.7 3.9 ...

Ya que tenemos un breve vistazo de la base de datos, con sus variables y algunos valores.

  • Cambiamos la varible Conf a un tipo factor, para cambiar las etiquetas y crear nuestras gráficas más adelante, por lo que obtenemos los niveles 0: SDD, 1: HDD.
  • De la base de datos extraemos cada columna y se le asigna el nombre de la variable que representa cada columna.
# Ajustar la variable Conf como factor
datos$Conf <- as.factor(datos$Conf)
str(datos$Conf)
##  Factor w/ 2 levels "0","1": 2 1 2 1 2 2 1 1 1 2 ...
Tiempo<-datos$Tiempo
Carga<-datos$Carga
Tipo_disco<-datos$Conf

Ahora empezamos a separar los datos en los que corresponden a discos SDD y HDD, para poder hacer más práctico la gráficos de dispersión.

carga.sdd<-Carga[Tipo_disco == 0]
carga.hdd<-Carga[Tipo_disco == 1]
tiempo.sdd<-Tiempo[Tipo_disco == 0]
tiempo.hdd<-Tiempo[Tipo_disco == 1]
datos.sdd<-data.frame(carga.sdd,tiempo.sdd)
datos.hdd<-data.frame(carga.hdd,tiempo.hdd)

Relación tiempo y carga disco SDD

  • En esta ocasión con el qqplot vemos los datos de forma estándar y que tiene una distribución normal.
#Relacion tiempo y carga disco SDD
qqPlot(datos.sdd$tiempo.sdd, pch=20)

## [1] 12  6

Generamos la gráfica que relaciona las consultas por minutos del disco SDD con el tiempo de respuesta del mismo dispositivo, también se presenta una relación positiva.

ggplot(datos.sdd, aes(x=carga.sdd,y=tiempo.sdd)) +
  geom_point()+
  xlab("Consultas por minuto disco SDD")+
  ylab("Tiempo de respuesta disco SDD")+
  theme_bw()

Con la función cor.test analizamos el coeficiente de relación con diferentes métodos, nosotros decidimos usar el de Pearson, ya que con los datos tienen una distribucio normal.

cor.test(x= datos.sdd$carga.sdd, y= datos.sdd$tiempo.sdd, alternative = "greater", method = "pearson" )
## 
##  Pearson's product-moment correlation
## 
## data:  datos.sdd$carga.sdd and datos.sdd$tiempo.sdd
## t = 28.334, df = 10, p-value = 3.487e-11
## alternative hypothesis: true correlation is greater than 0
## 95 percent confidence interval:
##  0.9816387 1.0000000
## sample estimates:
##       cor 
## 0.9938293

Relación tiempo y carga disco HDD

  • En esta ocasión con el qqplot vemos que los datos tiene una distribución normal.
#Relacion tiempo y carga disco HDD
qqPlot(datos.hdd$tiempo.hdd, pch=20)

## [1] 1 8

Generamos la gráfica que relaciona las consultas por minutos del disco HDD con el tiempo de respuesta del mismo dispositivo, además se puede notar que la relación de las variables tiene una relación positiva.

ggplot(datos.hdd, aes(x=carga.hdd,y=tiempo.hdd)) +
  geom_point()+
  xlab("Consultas por minuto disco HDD")+
  ylab("Tiempo de respuesta disco HDD")+
  theme_bw()

Con la función cor.test analizamos el coeficiente de relación con diferentes metodos, nosotros decidimos usar el de Pearson, ya que con los datos tienen una distribucio normal.

cor.test(x= datos.hdd$carga.hdd, y= datos.hdd$tiempo.hdd, alternative = "greater", method = "pearson" )
## 
##  Pearson's product-moment correlation
## 
## data:  datos.hdd$carga.hdd and datos.hdd$tiempo.hdd
## t = 12.024, df = 11, p-value = 5.698e-08
## alternative hypothesis: true correlation is greater than 0
## 95 percent confidence interval:
##  0.9013679 1.0000000
## sample estimates:
##       cor 
## 0.9640003

Las relaciones de distribución de disco HDD y SDD juntos

Se puede observar que, para ambos tipos de discos, existe una fuerte correlación entre carga y tiempo. Además, al graficar la variables carga con la variables tiempo, distinguiendo cada tipo de disco con diferente color, se aprecia un comportamiento interactivo según el tipo de disco.

ggplot(data = datos)+
  geom_point(aes(x=Carga , y=Tiempo, col= Tipo_disco))+
  geom_smooth(aes(x= Carga, y=Tiempo,col= Tipo_disco))+
  geom_text(data = NULL,x=2.5, y=5, label="Correlación.SSD",col="red")+
  geom_text(data = NULL, x=2.5, y=5.5, label="Correlación.HDD",col="blue")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

II. Ajuste un primer modelo de regresión simple (Modelo 1) que reproduzca la relación entre la carga y el tiempo de respuesta, sin incluir la configuración del disco duro. Evalúe la bondad de ajuste de este modelo e interprete los resultados obtenidos.

  • El modelo tiene un R-cuadrado ajustado de 0,8537, que es un número bastante alto. Sería conveniente añadir más variables explicativas para ver si se mantiene este alto grado de concordancia. Podemos concluir que todo este patrón tiene sentido.
#4. (punto 2)

modelo1<-lm(Tiempo~ Carga,data = datos)
summary(modelo1)
## 
## Call:
## lm(formula = Tiempo ~ Carga, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.16824 -0.40281 -0.03945  0.43541  1.07627 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.04838    0.26321   0.184    0.856    
## Carga        0.49214    0.04177  11.783 3.18e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5837 on 23 degrees of freedom
## Multiple R-squared:  0.8579, Adjusted R-squared:  0.8517 
## F-statistic: 138.8 on 1 and 23 DF,  p-value: 3.177e-11

Mirar el juste del modelo sobre los puntos:

# Mirar el juste del modelo sobre los puntos:
ggplot(datos, aes(x= Carga, y= Tiempo)) + 
  geom_point() + 
  theme_bw()+
  geom_line(aes( x = Carga, 
                 y = predict(modelo1, datos)), 
            color = "red")

Inspección de los residuos

# Inspección de los residuos
x11()
par(mfrow=c(2,2))
plot(modelo1)

III.Obtenga un nuevo modelo (Modelo 2) en el que incluya el tipo de disco y su interacción con la

carga del equipo. Analicé los resultados y evalue la bondad de ajuste del nuevo modelo.

Ahora se ajusta un nuevo modelo, que incluye la variable tipo_disco y la interacción entre dicha variable y la variable de carga.

#5. (punto 3)

modelo2 <- lm(datos$Tiempo ~ datos$Carga  + Tipo_disco + datos$Carga*Tipo_disco)
summary(modelo2)
## 
## Call:
## lm(formula = datos$Tiempo ~ datos$Carga + Tipo_disco + datos$Carga * 
##     Tipo_disco)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.68547 -0.11333  0.06881  0.15302  0.41807 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             -1.37549    0.20902  -6.581 1.62e-06 ***
## datos$Carga              0.71979    0.03367  21.376 9.88e-16 ***
## Tipo_disco1              2.26391    0.26520   8.536 2.86e-08 ***
## datos$Carga:Tipo_disco1 -0.35734    0.04227  -8.454 3.36e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2844 on 21 degrees of freedom
## Multiple R-squared:  0.9692, Adjusted R-squared:  0.9648 
## F-statistic: 220.2 on 3 and 21 DF,  p-value: 5.042e-16
x11()
par(mfrow=c(2,2))
plot(modelo2)

El modelo tiene un R-Square ajustado de 0.9692; un número bastante grande. Si lo Comparámos con el Modelo 1, que tiene más variables explicativas y modela la interacción, el Modelo 2 tiene un mejor ajuste.

IV. Escriba la ecuación del modelo 2 y represéntela gráficamente, junto con los datos observados

  • La ecuación: Tiempo=b0+b1∗Carga+b2Tipo_disco+b3Carga∗Tipo_disco
#6. (punto 4)
ggplot(data = datos)+
  geom_line(aes(x=Carga , y=Tiempo, col= Tipo_disco))+
  geom_smooth(aes(x= Carga, y=Tiempo,col= Tipo_disco))+
  geom_text(data = NULL,x=3, y=1, label="Disco SDD",col="red")+
  geom_text(data = NULL, x=3.5, y=2.5, label="Disco HDD",col="blue")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

V. Mediante el test anova, pruebe que la inclusión de la variable cualitativa configuración del disco, mejora significativamente el ajuste del modelo.

  • Usamos el test Anova, para comparar las varianzas entre los promedios de los “tipos_disco”
  • Con el test anova vemos que el modelo dos tiene un mejor ajuste.
  • Con los datos que nos proporcione la prueba, decidimos si rechazar la H0 o aceptarla.
#7. (punto 5)
anova(modelo1,modelo2)
## Warning in anova.lmlist(object, ...): models with response '"datos$Tiempo"'
## removed because response differs from model 1
## Analysis of Variance Table
## 
## Response: Tiempo
##           Df Sum Sq Mean Sq F value    Pr(>F)    
## Carga      1 47.313  47.313  138.84 3.177e-11 ***
## Residuals 23  7.838   0.341                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ggplot(data = datos)+
  geom_point(aes(x=Carga,y=Tiempo))+
  geom_line(aes(x=Carga,y=predict(modelo1)),col= "green")+
  geom_line(aes(x=Carga,y=predict(modelo2)),col= "blue")

Prueba de Hipótesis aquí: H0: El modelo NO contribuye a explicar el tiempo de respuesta del disco H1: El modelo SI contribuye a explicar el tiempo de respuesta del disco

La prueba de Anova nos muestra que la variable “Conf” mejora significativamente el ajuste del modelo, ya que según los datos, alfa es mayor o igual al “valor-p” encontrado, entonces nos dice que se rechaza la H0, es decir, nos quedamos con la H1.

6. Evaluación del los supuestos en los modelos (1 y 2)

#### Modelo 1
modelo1<-lm(Tiempo~ Carga,data = datos)
summary(modelo1)
## 
## Call:
## lm(formula = Tiempo ~ Carga, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.16824 -0.40281 -0.03945  0.43541  1.07627 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.04838    0.26321   0.184    0.856    
## Carga        0.49214    0.04177  11.783 3.18e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5837 on 23 degrees of freedom
## Multiple R-squared:  0.8579, Adjusted R-squared:  0.8517 
## F-statistic: 138.8 on 1 and 23 DF,  p-value: 3.177e-11
#### Modelo 2
modelo2 <- lm(datos$Tiempo ~ datos$Carga  + Tipo_disco + datos$Carga*Tipo_disco)
summary(modelo2)
## 
## Call:
## lm(formula = datos$Tiempo ~ datos$Carga + Tipo_disco + datos$Carga * 
##     Tipo_disco)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.68547 -0.11333  0.06881  0.15302  0.41807 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             -1.37549    0.20902  -6.581 1.62e-06 ***
## datos$Carga              0.71979    0.03367  21.376 9.88e-16 ***
## Tipo_disco1              2.26391    0.26520   8.536 2.86e-08 ***
## datos$Carga:Tipo_disco1 -0.35734    0.04227  -8.454 3.36e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2844 on 21 degrees of freedom
## Multiple R-squared:  0.9692, Adjusted R-squared:  0.9648 
## F-statistic: 220.2 on 3 and 21 DF,  p-value: 5.042e-16

Ahora los supuestos:

1. Linealidad

Existe relación lineal entre las variables independiente y la dependiente. Se verifica en la gráfica, al ser la pendiente (en rojo) horizontal.

plot(modelo1, 1)

plot(modelo2, 1)

2. Normalidad en los residuos (errores)

### Los residuos (errores) no siguen una distribución normal,
plot(modelo1, 2)

plot(modelo2, 2)

### por esto, se realiza una prueba de Shapiro
shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.98568, p-value = 0.9702
shapiro.test(modelo2$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo2$residuals
## W = 0.95551, p-value = 0.3323
### Prueba de Hipótesis aquí:
###  **H0: tiene distribución normal**
###  **H1: no tiene distribución normal**

3. Homocedasticidad de residuos (errores)

Homocedasticidad: básicamente es cuando la varianza de los errores es constante; al no serlo, entonces el modelo es heterocedástico.

plot(modelo1, 3)

plot(modelo2, 3)

### Por esto, realizamos la prueba heterocedásticidad de Breusch-Pagan.
ncvTest(modelo1)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.2789668, Df = 1, p = 0.59738
ncvTest(modelo2)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.8566399, Df = 1, p = 0.35468
### Prueba de Hipótesis aquí:
###  **H0: existe homocedasticidad**
###  **H1: no existe homocedasticidad**

4. Identificación de valores atípicos

Esos valores atípicos son las observaciones que se diferencian en gran medida de los datos; estos valores generan errores de predicción.

Para detectarlos en los modelos, se utiliza la distancia de Cook, que es una medida de influencia que nos ayuda a detectar las observaciones engañosas.

plot(modelo1, 4)

plot(modelo2, 4)

## Por distancia: aquí se calculan los valores para cada una de las observaciones
cooks.distance(modelo1)
##            1            2            3            4            5            6 
## 3.957770e-02 1.070654e-01 9.975664e-02 7.495573e-02 4.122584e-02 1.517376e-02 
##            7            8            9           10           11           12 
## 1.036612e-02 6.685587e-04 1.479747e-04 8.446262e-04 1.188038e-01 2.707325e-02 
##           13           14           15           16           17           18 
## 4.011530e-01 5.972031e-03 4.356153e-02 9.764873e-02 2.002827e-02 2.194251e-02 
##           19           20           21           22           23           24 
## 1.896209e-02 7.135512e-04 3.514769e-06 1.142116e-02 8.831791e-04 9.438761e-03 
##           25 
## 2.521817e-01
cooks.distance(modelo2)
##            1            2            3            4            5            6 
## 0.1658634662 0.0905862993 0.0406351417 0.0025552594 0.0483381707 0.0079056332 
##            7            8            9           10           11           12 
## 0.0275009686 0.0109222905 0.0544349187 0.0062373412 0.0483895235 0.0004449291 
##           13           14           15           16           17           18 
## 0.6378665832 0.1779560348 0.0107162873 0.0068098646 0.0024547188 0.0010324263 
##           19           20           21           22           23           24 
## 0.0488100640 0.0015909278 0.0019310520 0.0046846553 0.0105064794 0.0102887625 
##           25 
## 0.1959573273