library(agricolae)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(ART)
library(ARTool)
library(car)
## Loading required package: carData
library(ggplot2)
ds=read.csv(file = "dataset.csv")
str(ds)
## 'data.frame': 60 obs. of 4 variables:
## $ Respuesta: num 0.236 0.238 0.233 0.214 0.215 ...
## $ Longitud : int 1 1 1 2 2 2 3 3 3 4 ...
## $ Masa : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Angulo : int 1 1 1 1 1 1 1 1 1 1 ...
View(ds)
f.long=factor(ds$Longitud)
f.masa=factor(ds$Masa)
f.angulo=factor(ds$Angulo)
# Gráficos de caja para determinar si existen outliers
boxplot(ds$Respuesta~(f.long+f.masa+f.angulo),col="darkgray",xlab = "Combinaciones",ylab = "Periodo (T)",cex.names=1,las=2)

g.1=boxplot(ds$Respuesta~f.long,xlab = "Factor longitud de cuerda",ylab="Periodo (T)",main="Respuesta por cada nivel")

g.2=boxplot(ds$Respuesta~f.masa,xlab = "Factor masa",ylab="Periodo (T)",main="Respuesta por cada nivel")

g.3=boxplot(ds$Respuesta~f.angulo,xlab = "Factor angulo",ylab="Periodo (T)",main="Respuesta por cada nivel")

#Análisis estadístico
modelo.pendulo=lm(ds$Respuesta~(f.long*f.masa*f.angulo))
summary(modelo.pendulo)
##
## Call:
## lm(formula = ds$Respuesta ~ (f.long * f.masa * f.angulo))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0060333 -0.0009167 -0.0000333 0.0009250 0.0069333
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.2353667 0.0015614 150.740 < 2e-16 ***
## f.long2 -0.0204667 0.0022082 -9.269 1.65e-11 ***
## f.long3 -0.0394000 0.0022082 -17.843 < 2e-16 ***
## f.long4 -0.0645000 0.0022082 -29.210 < 2e-16 ***
## f.long5 -0.0907000 0.0022082 -41.075 < 2e-16 ***
## f.masa2 -0.0023667 0.0022082 -1.072 0.290
## f.angulo2 0.0008333 0.0022082 0.377 0.708
## f.long2:f.masa2 0.0017667 0.0031228 0.566 0.575
## f.long3:f.masa2 0.0021667 0.0031228 0.694 0.492
## f.long4:f.masa2 0.0009667 0.0031228 0.310 0.759
## f.long5:f.masa2 0.0018000 0.0031228 0.576 0.568
## f.long2:f.angulo2 0.0017333 0.0031228 0.555 0.582
## f.long3:f.angulo2 0.0011667 0.0031228 0.374 0.711
## f.long4:f.angulo2 0.0017000 0.0031228 0.544 0.589
## f.long5:f.angulo2 0.0007333 0.0031228 0.235 0.816
## f.masa2:f.angulo2 0.0047333 0.0031228 1.516 0.137
## f.long2:f.masa2:f.angulo2 -0.0027000 0.0044163 -0.611 0.544
## f.long3:f.masa2:f.angulo2 -0.0029667 0.0044163 -0.672 0.506
## f.long4:f.masa2:f.angulo2 -0.0037333 0.0044163 -0.845 0.403
## f.long5:f.masa2:f.angulo2 -0.0051333 0.0044163 -1.162 0.252
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.002704 on 40 degrees of freedom
## Multiple R-squared: 0.9953, Adjusted R-squared: 0.9931
## F-statistic: 445.7 on 19 and 40 DF, p-value: < 2.2e-16
anvar=aov(modelo.pendulo)
summary(anvar)
## Df Sum Sq Mean Sq F value Pr(>F)
## f.long 4 0.06177 0.015444 2111.504 < 2e-16 ***
## f.masa 1 0.00000 0.000000 0.026 0.871885
## f.angulo 1 0.00012 0.000119 16.232 0.000244 ***
## f.long:f.masa 4 0.00001 0.000001 0.202 0.935556
## f.long:f.angulo 4 0.00001 0.000002 0.296 0.878698
## f.masa:f.angulo 1 0.00001 0.000013 1.711 0.198351
## f.long:f.masa:f.angulo 4 0.00001 0.000003 0.362 0.833878
## Residuals 40 0.00029 0.000007
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Pruebas de rango múltiple
rank.long=duncan.test(ds$Respuesta,trt=f.long,MSerror =0.000007,DFerror = 40,alpha = 0.05 )
rank.long$groups
## ds$Respuesta groups
## 1 0.2357833 a
## 2 0.2163917 b
## 3 0.1973083 c
## 4 0.1716833 d
## 5 0.1450667 e
rank.angulo=duncan.test(ds$Respuesta,trt=f.angulo,MSerror =0.000007,DFerror = 40,alpha = 0.05 )
rank.angulo$groups
## ds$Respuesta groups
## 2 0.1946533 a
## 1 0.1918400 b
plot(rank.long)

plot(rank.angulo)

shapiro.test(residuals.lm(modelo.pendulo))
##
## Shapiro-Wilk normality test
##
## data: residuals.lm(modelo.pendulo)
## W = 0.96049, p-value = 0.0497
g.norm=qqplot(seq(-3,3,by=0.01),residuals.lm(modelo.pendulo),xlab = "Residuales Estándar",ylab = "Residuales del modelo",pch="*",main="Gráfica de Probabilidad Normal")
qqline(residuals.lm(modelo.pendulo),col="red",lty=2)
abline(h=0,col="blue",lty=3)

dwtest(modelo.pendulo)
##
## Durbin-Watson test
##
## data: modelo.pendulo
## DW = 2.5099, p-value = 0.2722
## alternative hypothesis: true autocorrelation is greater than 0
residualPlot(modelo.pendulo,type="rstandard",xlab="Valores ajustados",ylab="Residuales Estándar",pch="*",main="Residuales contra ajustes")

boxplot(modelo.pendulo$residuals~f.long,xlab = "Factor longitud de cuerda",ylab="Residuales Estándar",main="Residuales contra niveles")
abline(h=0,lty=3,col="red")

boxplot(modelo.pendulo$residuals~f.masa,xlab = "Factor masa",ylab="Residuales Estándar",main="Residuales contra niveles")
abline(h=0,lty=3,col="red")

boxplot(modelo.pendulo$residuals~f.angulo,xlab = "Factor ángulo",ylab="Residuales Estándar",main="Residuales contra niveles")
abline(h=0,lty=3,col="red")

ncvTest(modelo.pendulo)
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 0.03921503, Df = 1, p = 0.84302
#Dado que no existen condiciones de normalidad, se prueba la libreria ARtool, para realizar la transformacion de rango alineada
ds.art=data.frame(ds$Respuesta,as.factor(ds$Longitud),as.factor(ds$Masa),as.factor(ds$Angulo))
names(ds.art)=list("Respuesta","Longitud","Masa","Angulo")
View(ds.art)
modelo.art=art(Respuesta~(Longitud*Masa*Angulo),data = ds.art)
anova.art=anova(modelo.art)
print(modelo.art)
## Aligned Rank Transform of Factorial Model
##
## Call:
## art(formula = Respuesta ~ (Longitud * Masa * Angulo), data = ds.art)
##
## Column sums of aligned responses (should all be ~0):
## Longitud Masa Angulo
## 0 0 0
## Longitud:Masa Longitud:Angulo Masa:Angulo
## 0 0 0
## Longitud:Masa:Angulo
## 0
##
## F values of ANOVAs on aligned responses not of interest (should all be ~0):
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 0 0 0 0 0
print(anova.art)
## Analysis of Variance of Aligned Rank Transformed Data
##
## Table Type: Anova Table (Type III tests)
## Model: No Repeated Measures (lm)
## Response: art(Respuesta)
##
## Df Df.res F value Pr(>F)
## 1 Longitud 4 40 2.4615e+02 < 2.22e-16 ***
## 2 Masa 1 40 6.1064e-04 0.98041
## 3 Angulo 1 40 1.9825e+01 6.6477e-05 ***
## 4 Longitud:Masa 4 40 4.5141e-01 0.77074
## 5 Longitud:Angulo 4 40 7.2229e-01 0.58185
## 6 Masa:Angulo 1 40 2.8290e+00 0.10037
## 7 Longitud:Masa:Angulo 4 40 7.2438e-01 0.58048
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Analisis post-hoc
# Efectos principales
contr.longitud=art.con(modelo.art,"Longitud",adjust="tukey")
## NOTE: Results may be misleading due to involvement in interactions
print(contr.longitud)
## contrast estimate SE df t.ratio p.value
## Longitud1 - Longitud2 12 1.71 40 7.016 <.0001
## Longitud1 - Longitud3 24 1.71 40 14.033 <.0001
## Longitud1 - Longitud4 36 1.71 40 21.049 <.0001
## Longitud1 - Longitud5 48 1.71 40 28.066 <.0001
## Longitud2 - Longitud3 12 1.71 40 7.016 <.0001
## Longitud2 - Longitud4 24 1.71 40 14.033 <.0001
## Longitud2 - Longitud5 36 1.71 40 21.049 <.0001
## Longitud3 - Longitud4 12 1.71 40 7.016 <.0001
## Longitud3 - Longitud5 24 1.71 40 14.033 <.0001
## Longitud4 - Longitud5 12 1.71 40 7.016 <.0001
##
## Results are averaged over the levels of: Masa, Angulo
## P value adjustment: tukey method for comparing a family of 5 estimates
contr.masa=art.con(modelo.art,"Masa",adjust="tukey")
## NOTE: Results may be misleading due to involvement in interactions
print(contr.masa)
## contrast estimate SE df t.ratio p.value
## Masa1 - Masa2 0.133 5.4 40 0.025 0.9804
##
## Results are averaged over the levels of: Longitud, Angulo
contr.angulo=art.con(modelo.art,"Angulo",adjust="tukey")
## NOTE: Results may be misleading due to involvement in interactions
print(contr.angulo)
## contrast estimate SE df t.ratio p.value
## Angulo1 - Angulo2 -19.9 4.46 40 -4.453 0.0001
##
## Results are averaged over the levels of: Longitud, Masa