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:
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.
# 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)
#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
#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
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'
#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)
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.
#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'
#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.
#### 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:
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)
### 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**
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**
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