Se quiere ver cómo un factor, Nutriente, afecta el crecimiento de una especie de planta, donde el factor tiene 5 niveles (Sin Nutriente, N, NK, NP, NPK).
Un DCA se diseñaría de tal manera que tuvieramos varias unidades experimentales independientes en cada tratamiento.
La aleatorización se realizaría espacialmente para la selección de las plantas o la ubicación de las parcelas de muestreo, pero también se realizaría en la asignación de los tratamientos a cada una de las plantas o parcelas.
#wd="C:/Users/MAO/Desktop/Aplicada III"
#setwd(wd) # Establecer el directorio de trabajo
#library("easypackages") # Libreria especial para hacer carga automática de librerias
#lib_req<-c("ggplot2", "car", "nortest", "lmtest", "agricolae", "lsmeans", "emmeans", "multcomp", "PMCMRplus", "nlme", "coin", "rcompanion")# Listado de librerias requeridas por el script
#easypackages::packages(lib_req) # Verificación, instalación y carga de librerias.
data <- read.table("Plantas.txt", header=TRUE, dec=".", stringsAsFactors = F,encoding ="UTF-8")
names(data)
## [1] "Finca" "Nutriente" "Altura"
str(data)
## 'data.frame': 25 obs. of 3 variables:
## $ Finca : int 1 2 3 4 5 1 2 3 4 5 ...
## $ Nutriente: chr "1Sin" "1Sin" "1Sin" "1Sin" ...
## $ Altura : int 7 7 9 11 15 12 12 17 18 18 ...
table(data$Nutriente)
##
## 1Sin 2N 3NP 4NPK 5NK
## 5 5 5 5 5
data$Nutriente = factor(data$Nutriente)
str(data)
## 'data.frame': 25 obs. of 3 variables:
## $ Finca : int 1 2 3 4 5 1 2 3 4 5 ...
## $ Nutriente: Factor w/ 5 levels "1Sin","2N","3NP",..: 1 1 1 1 1 2 2 2 2 2 ...
## $ Altura : int 7 7 9 11 15 12 12 17 18 18 ...
coef.var=function(x){
sd(x)/mean(x)
}
media <- tapply(data$Altura, data$Nutriente, mean)
desvest <- tapply(data$Altura, data$Nutriente, sd)
CV <- tapply(data$Altura, data$Nutriente, coef.var)
Resumen <- cbind(media, desvest, CV)
round(Resumen,2)
## media desvest CV
## 1Sin 9.8 3.35 0.34
## 2N 15.4 3.13 0.20
## 3NP 17.6 2.07 0.12
## 4NPK 21.6 2.61 0.12
## 5NK 10.8 2.86 0.27
stripchart(Altura~Nutriente, data, vertical=T,pch=18,xlab="Nutriente")
abline(h=mean(data$Altura),col="blue", lty=2)
points(media, pch=19, col="red")
Con el fin de evaluar si el factor Nutriente, afecta el crecimiento de la planta en estudio, debemos comprobar el siguiente contraste de hipotesis:
H0: No hay un efecto del factor de tratamiento sobre el crecimiento de las plantas H1: Al menos uno de los tratamientos tiene un efecto significativo sobre el crecimiento de las plantas
mod.1<-lm(Altura~Nutriente, data)
Veamos el resultado (Recuerda que antes de interpretar, es necesario validar los supuestos del modelo)
anova(mod.1)
## Analysis of Variance Table
##
## Response: Altura
## Df Sum Sq Mean Sq F value Pr(>F)
## Nutriente 4 475.76 118.94 14.757 9.128e-06 ***
## Residuals 20 161.20 8.06
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Al evaluar la significacia del estadístico de prueba F, se observa un p-valor=0.000, indicando que al menos uno uno de los tratamientos tiene un efecto significativo sobre el crecimiento de las plantas.
Recordemos que el ANOVA solo nos indica si existe o no al menos un tratamiento que presente un efecto significativo sobre el crecimiento de las plantas, pero: ¿cuales tratamientos difieren o presentan mejores resultados?
resid <- residuals(mod.1)
pred <- fitted(mod.1)
plot(pred,resid)
abline(h=mean(resid))
t.test(resid, mu = 0, alternative = c("two.sided"))
##
## One Sample t-test
##
## data: resid
## t = -1.6704e-16, df = 24, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -1.069782 1.069782
## sample estimates:
## mean of x
## -8.658005e-17
qqPlot(resid, pch=20)
## [1] 5 25
#Cuando n<30
shapiro.test(resid)
##
## Shapiro-Wilk normality test
##
## data: resid
## W = 0.94387, p-value = 0.1818
#Cuando n>=30
#nortest::ad.test(resid)
#Bajo cumplimiento de normalidad.
bartlett.test(resid~Nutriente, data)
##
## Bartlett test of homogeneity of variances
##
## data: resid by Nutriente
## Bartlett's K-squared = 0.93309, df = 4, p-value = 0.9198
#Bajo no normalidad
#car::leveneTest(resid~Nutriente, data)
dwtest(mod.1)
##
## Durbin-Watson test
##
## data: mod.1
## DW = 1.7819, p-value = 0.07288
## alternative hypothesis: true autocorrelation is greater than 0
Aunque existen diferentes pruebas, Se eligirá una u otra dependiendo del riesgo que estemos dispuestos a correr al aceptar más o menos diferencias significativas.
# Prueba de Tukey (consevardor) - Alpha Global
agricolae::HSD.test(mod.1,"Nutriente", alpha=0.05, console=TRUE, group=TRUE)
##
## Study: mod.1 ~ "Nutriente"
##
## HSD Test for Altura
##
## Mean Square Error: 8.06
##
## Nutriente, means
##
## Altura std r Min Max
## 1Sin 9.8 3.346640 5 7 15
## 2N 15.4 3.130495 5 12 18
## 3NP 17.6 2.073644 5 14 19
## 4NPK 21.6 2.607681 5 19 25
## 5NK 10.8 2.863564 5 7 15
##
## Alpha: 0.05 ; DF Error: 20
## Critical Value of Studentized Range: 4.231857
##
## Minimun Significant Difference: 5.372958
##
## Treatments with the same letter are not significantly different.
##
## Altura groups
## 4NPK 21.6 a
## 3NP 17.6 ab
## 2N 15.4 bc
## 5NK 10.8 cd
## 1Sin 9.8 d
# Prueba de Fisher (no consevardor) -Alpha individual para cada comparación.
#agricolae::LSD.test(mod.1,"Nutriente", alpha=0.05, console=TRUE, group=TRUE)
# Prueba de Newman-Kewls (Intermedio) -Alpha Intermedio entre Fisher y Tukey
#agricolae::SNK.test(mod.1,"Nutriente", alpha=0.05, console=TRUE, group=TRUE)
leastsquare1 <- lsmeans(mod.1,~Nutriente)
pairs(leastsquare1, adjust="Tukey")
## contrast estimate SE df t.ratio p.value
## 1Sin - 2N -5.6 1.8 20 -3.119 0.0385
## 1Sin - 3NP -7.8 1.8 20 -4.344 0.0026
## 1Sin - 4NPK -11.8 1.8 20 -6.572 <.0001
## 1Sin - 5NK -1.0 1.8 20 -0.557 0.9798
## 2N - 3NP -2.2 1.8 20 -1.225 0.7372
## 2N - 4NPK -6.2 1.8 20 -3.453 0.0189
## 2N - 5NK 4.6 1.8 20 2.562 0.1163
## 3NP - 4NPK -4.0 1.8 20 -2.228 0.2101
## 3NP - 5NK 6.8 1.8 20 3.787 0.0091
## 4NPK - 5NK 10.8 1.8 20 6.015 0.0001
##
## P value adjustment: tukey method for comparing a family of 5 estimates
multcomp::cld(leastsquare1, alpha=.05, Letters=letters)
## Nutriente lsmean SE df lower.CL upper.CL .group
## 1Sin 9.8 1.27 20 7.15 12.4 a
## 5NK 10.8 1.27 20 8.15 13.4 ab
## 2N 15.4 1.27 20 12.75 18.0 bc
## 3NP 17.6 1.27 20 14.95 20.2 cd
## 4NPK 21.6 1.27 20 18.95 24.2 d
##
## Confidence level used: 0.95
## P value adjustment: tukey method for comparing a family of 5 estimates
## significance level used: alpha = 0.05
## NOTE: Compact letter displays can be misleading
## because they show NON-findings rather than findings.
## Consider using 'pairs()', 'pwpp()', or 'pwpm()' instead.
Hacer uso de la prueba No Paramétrica de Kruskal-Wallis, intuitivamente es igual que un ANOVA con los datos reemplazados por categorías, pero en este caso bajo el incumplimiento del supuesto de Normalidad. Sin embargo, si asume, que los datos vienen de la misma distribución (asume homogeneidad de varianzas).
kruskal.test(Altura~Nutriente, data)
##
## Kruskal-Wallis rank sum test
##
## data: Altura by Nutriente
## Kruskal-Wallis chi-squared = 19.064, df = 4, p-value = 0.0007636
Podemos observar que los nutrientes presentan un efecto significativo.
Para estos casos, hacemos uso de la función: posthoc.kruskal.nemenyi.test(), sin embargo, se debe tener en cuenta que esta prueba se ve afectada por los empates. De acuerdo a esto, se debe hacer un ajuste en la varianza de los datos, cambiando el metodo para determinar los p-valor.
Casos en los que no hay empates en los datos: se hace uso de dist=“Tukey”. Casos en que los se presenten empates en los datos: se hace uso de dist=“Chisq”
#Cuando No hay empates.
#PMCMRplus::kwAllPairsNemenyiTest(x=data$Altura, g=data$Nutriente, dist="Tukey")
#Si hay empates (algunos valores de la variables respuesta son iguales).
PMCMRplus::kwAllPairsNemenyiTest(x=data$Altura, g=data$Nutriente, dist="Chisquare")
## Warning in kwAllPairsNemenyiTest.default(x = data$Altura, g = data$Nutriente, :
## Ties are present. Chi-sq was corrected for ties.
##
## Pairwise comparisons using Nemenyi's all-pairs test with chi-square approximation
## data: data$Altura and data$Nutriente
## 1Sin 2N 3NP 4NPK
## 2N 0.5973 - - -
## 3NP 0.1864 0.9545 - -
## 4NPK 0.0085 0.3893 0.8329 -
## 5NK 0.9994 0.7408 0.2921 0.0189
##
## P value adjustment method: single-step
## alternative hypothesis: two.sided
Para este caso utilizamos la función gls(). Los minimos cuadrados generalizados (en ingles, generalized least squares (GLS)) es una técnica para la estimación de los parametros desconocidos en un modelo de regresión lineal.
El GLS es adecuado cuando las varianzas de las observaciones son desiguales, o cuando existe un cierto grado de correlación entre las observaciones.
Incorporamos en el modelo la matriz de varianzas desiguales, donde cada varianza depende de su tratamiento:
mod_heterog<-nlme::gls(Altura~1+Nutriente,
weight=varComb(varIdent(form=~1|Nutriente)),
data)
summary(mod_heterog)
## Generalized least squares fit by REML
## Model: Altura ~ 1 + Nutriente
## Data: data
## AIC BIC logLik
## 125.5166 135.4739 -52.7583
##
## Combination of variance functions:
## Structure: Different standard deviations per stratum
## Formula: ~1 | Nutriente
## Parameter estimates:
## 1Sin 2N 3NP 4NPK 5NK
## 1.0000000 0.9354152 0.6196199 0.7791983 0.8556557
##
## Coefficients:
## Value Std.Error t-value p-value
## (Intercept) 9.8 1.496660 6.547913 0.0000
## Nutriente2N 5.6 2.049387 2.732524 0.0128
## Nutriente3NP 7.8 1.760678 4.430111 0.0003
## Nutriente4NPK 11.8 1.897367 6.219144 0.0000
## Nutriente5NK 1.0 1.969770 0.507674 0.6172
##
## Correlation:
## (Intr) Ntrn2N Ntr3NP Nt4NPK
## Nutriente2N -0.730
## Nutriente3NP -0.850 0.621
## Nutriente4NPK -0.789 0.576 0.671
## Nutriente5NK -0.760 0.555 0.646 0.599
##
## Standardized residuals:
## Min Q1 Med Q3 Max
## -1.7360769 -0.8366617 0.1533924 0.6751410 1.5538002
##
## Residual standard error: 3.346634
## Degrees of freedom: 25 total; 20 residual
El weight nos permite determinar que tanto crecen o decrecen las variaznas dentro de cada tratamiento respecto a la primera.
Estimamos el ANOVA para el modelo construido:
anova(mod_heterog)
## Denom. DF: 20
## numDF F-value p-value
## (Intercept) 1 878.3935 <.0001
## Nutriente 4 14.9618 <.0001
Podemos observar que los nutrientes presentan un efecto significativo.
leastsquare1 <- lsmeans(mod_heterog,~Nutriente)
pairs(leastsquare1, adjust="tukey")
## contrast estimate SE df t.ratio p.value
## 1Sin - 2N -5.6 2.05 7.99 -2.733 0.1341
## 1Sin - 3NP -7.8 1.76 6.86 -4.430 0.0187
## 1Sin - 4NPK -11.8 1.90 7.72 -6.219 0.0019
## 1Sin - 5NK -1.0 1.97 7.93 -0.508 0.9842
## 2N - 3NP -2.2 1.68 7.07 -1.310 0.6945
## 2N - 4NPK -6.2 1.82 7.85 -3.403 0.0548
## 2N - 5NK 4.6 1.90 8.08 2.424 0.2015
## 3NP - 4NPK -4.0 1.49 7.62 -2.685 0.1469
## 3NP - 5NK 6.8 1.58 7.30 4.301 0.0193
## 4NPK - 5NK 10.8 1.73 7.95 6.235 0.0017
##
## Degrees-of-freedom method: satterthwaite
## P value adjustment: tukey method for comparing a family of 5 estimates
multcomp::cld(leastsquare1, alpha=0.05, Letters=letters)
## Nutriente lsmean SE df lower.CL upper.CL .group
## 1Sin 9.8 1.497 4.13 5.69 13.9 a
## 5NK 10.8 1.281 4.01 7.25 14.4 a
## 2N 15.4 1.400 4.08 11.54 19.3 ab
## 3NP 17.6 0.927 4.00 15.03 20.2 b
## 4NPK 21.6 1.166 4.00 18.36 24.8 b
##
## Degrees-of-freedom method: satterthwaite
## Confidence level used: 0.95
## P value adjustment: tukey method for comparing a family of 5 estimates
## significance level used: alpha = 0.05
## NOTE: Compact letter displays can be misleading
## because they show NON-findings rather than findings.
## Consider using 'pairs()', 'pwpp()', or 'pwpm()' instead.
Para este caso se observa que las diferencias entre tratamientos cambian un poco respecto al modelo con varianzas homogeneas.
Debemos estimar el modelo con varianzas homogeneas, pero para que sean comparables se debe utilizar el metodo de Mestimación de maxima Verosimilitud en ambos casos.
mod_hom<-gls(Altura~1+Nutriente, data, method="ML")
mod_het<-gls(Altura~1+Nutriente,
weight=varComb(varIdent(form=~1|Nutriente)),
data, method="ML")
anova(mod_hom, mod_het)
## Model df AIC BIC logLik Test L.Ratio p-value
## mod_hom 1 6 129.5412 136.8544 -58.77059
## mod_het 2 10 136.2582 148.4469 -58.12909 1 vs 2 1.282999 0.8643
Para determinar si existen diferencias significativas entre los tratamiento, haremos una prueba de indpendencia. Si los tratamientos son independientes, es porque cada tratamiento proviene de una distribución de probabilidad diferente. Indicando que hay diferencias entre los tratamiento.
coin::independence_test(Altura ~ Nutriente, data)
##
## Asymptotic General Independence Test
##
## data: Altura by Nutriente (1Sin, 2N, 3NP, 4NPK, 5NK)
## maxT = 3.1834, p-value = 0.007017
## alternative hypothesis: two.sided
PT <- rcompanion::pairwisePermutationTest(Altura ~ Nutriente, data, method="fdr")
PT
## Comparison Stat p.value p.adjust
## 1 1Sin - 2N = 0 -2.084 0.03712 0.05557
## 2 1Sin - 3NP = 0 -2.529 0.01145 0.03048
## 3 1Sin - 4NPK = 0 -2.731 0.006317 0.03048
## 4 1Sin - 5NK = 0 -0.53 0.5961 0.59610
## 5 2N - 3NP = 0 -1.261 0.2074 0.23040
## 6 2N - 4NPK = 0 -2.307 0.02105 0.04210
## 7 2N - 5NK = 0 1.952 0.05089 0.06361
## 8 3NP - 4NPK = 0 -2.065 0.0389 0.05557
## 9 3NP - 5NK = 0 2.507 0.01219 0.03048
## 10 4NPK - 5NK = 0 2.732 0.006294 0.03048
Presentando las diferecnias en letras a partir de los p.adjust:
cldList(p.adjust ~ Comparison, data = PT, threshold = 0.05)
## Group Letter MonoLetter
## 1 1Sin a a
## 2 2N ab ab
## 3 3NP bc bc
## 4 4NPK c c
## 5 5NK a a