graphics.off()
cat("\014")
require(table1)
## Cargando paquete requerido: table1
## Warning: package 'table1' was built under R version 4.5.3
##
## Adjuntando el paquete: 'table1'
## The following objects are masked from 'package:base':
##
## units, units<-
require(ggplot2)
## Cargando paquete requerido: ggplot2
require(agricolae)
## Cargando paquete requerido: agricolae
## Warning: package 'agricolae' was built under R version 4.5.3
require(car)
## Cargando paquete requerido: car
## Cargando paquete requerido: carData
load("Salinidad.RData")
str(Salinidad)
## 'data.frame': 45 obs. of 5 variables:
## $ Biomasa : num 765 954 828 755 896 ...
## $ pH : num 5 4.7 4.2 4.4 5.55 5.5 4.25 4.45 4.75 4.6 ...
## $ Salinidad: int 33 35 32 30 33 33 36 30 38 30 ...
## $ Zinc : num 16.5 14 15.3 17.3 22.3 ...
## $ Potasio : num 1442 1299 1154 1045 522 ...
#Análisis exploratorio univariado para cada característica
sapply(Salinidad, mean)
## Biomasa pH Salinidad Zinc Potasio
## 1082.172644 4.608889 30.266667 17.830796 797.377778
sapply(Salinidad, sd)
## Biomasa pH Salinidad Zinc Potasio
## 546.287433 1.254731 3.719726 8.274169 297.576022
cv = sapply(Salinidad, sd) / sapply(Salinidad, mean)*100
round(cv,1)
## Biomasa pH Salinidad Zinc Potasio
## 50.5 27.2 12.3 46.4 37.3
table1(~Biomasa + pH + Salinidad + Zinc + Potasio, data=Salinidad)
| Overall (N=45) |
|
|---|---|
| Biomasa | |
| Mean (SD) | 1080 (546) |
| Median [Min, Max] | 992 [370, 2340] |
| pH | |
| Mean (SD) | 4.61 (1.25) |
| Median [Min, Max] | 4.45 [3.20, 7.45] |
| Salinidad | |
| Mean (SD) | 30.3 (3.72) |
| Median [Min, Max] | 30.0 [24.0, 38.0] |
| Zinc | |
| Mean (SD) | 17.8 (8.27) |
| Median [Min, Max] | 19.2 [0.211, 31.3] |
| Potasio | |
| Mean (SD) | 797 (298) |
| Median [Min, Max] | 773 [351, 1440] |
#------------BIOMASA---------
#La biomasa presentó una media de 1080 g y una desviación estándar de 546 g,
#con valores entre 370 y 2340 g. El CV fue de 50.5% indicando una variabilidad
#relativamente alta entre las muestras. Mediana fue de 992 g.
#----------pH-----------------
#El pH presentó una media de 4.61, desviación estándar de 1.25 y valores entre 3.2 y 7.45. Su
#coeficiente de variación fue de 27.2%. Mediana de 4.45.
#----------------SALINIDAD------------------
#La salinidad presentó una media de 30.3, desviación estándar de 3.72 y un rango entre 24 y 38.
#El CV fue de 12.3%, siendo la variable con menor variabilidad relativa. Mediana de 30.
#------------------ZINC----------------
#Presentó una media de 17.8, desviación estándar de 8.27 y valores entre 0.2011 y 31.3. Su CV fue de 46.4%,
#indicando una alta variabilidad relativa. Mediana de 19.2.
#------------POTASIO-----------------------
#El potasio presentó una media de 797, desviación estándar de 298 y valores entre 351 y 1440. El CV
#fue de 37.3%, por lo que presentó una variabilidad relativa intermedia-alta. Mediana de 773.
par(mfrow = c(2,3))
hist(Salinidad$Biomasa, main="Biomasa", xlab="gr")
#Media mayor a la mediana. Distribución asimétrica a la derecha (positiva). Una moda principal en 500-1500 y un grupito aparte en 2000-2500.
hist(Salinidad$pH, main="pH", xlab="pH")
#Media ligeramente mayor a la mediana, aunque la presencia de valores elevados entre aproximadamente
# 7.1 y 7.45 incrementa la dispersión y genera cierta asimetría.Asimetría positiva. Varias modas:
# una en 3-3.5, otra en 4.5-5 y un grupo en 7+.
hist(Salinidad$Salinidad, main="Salinidad", xlab="Salinidad")
#Media prácticamente igual a la mediana. Casi simétrica. varias modas: una en 24-26, otra en 28-30 y en 34-36 (bimodal).
hist(Salinidad$Zinc, main="Zinc", xlab="Zinc")
#Media menor a la mediana. Asimetría negativa. Una moda en 15-25, con un grupito aparte cerca de 0.
hist(Salinidad$Potasio, main="Potasio", xlab="Potasio")
#Media un poco mayor a la mediana. Asimetría positiva (leve). Varias modas: 400-600, 800-1000 y 1200-1400.
par(mfrow = c(2,3))
boxplot(Salinidad$Biomasa,main="Biomasa")
#La mediana está casi en el centro de la caja, pero el bigote de arriba es mucho más largo que el de abajo.
#Indica asimetría positiva.
#No hay valores atípicos.Las muestras más altas están en el extremo del bigote.
boxplot(Salinidad$pH,main="pH")
#La caja va de 3.45 a 5.35 y la mdiana (4.45) está ubicada en medio. El bigote inferior es corto y el superior largo.
#Asimetría positiva.
#No hay valores atípicos.
boxplot(Salinidad$Salinidad, main="Salinidad")
#La mediana (30) queda justo en el centro de la caja y los bigotes son parecidos, el largo siendo un poco más largo.
#Es casi simétrica.
#Sin atípicos.
boxplot(Salinidad$Zinc,main="Zinc")
#Mediana más cerca de Q3 que de Q1, bigote de abajo termina en 9.4. Sumado al punto suelto, indica asimetría negativa.
#Valor atípico que representa a cinco muestras (0.21 a 0.37). Forman un grupo con características propias y no errores de medición.
boxplot(Salinidad$Potasio, main="Potasio")
#Bigote superior mucho más largo que el inferior. Asimetría positiva leve. Dentro de la caja, mediana un poco más cerca de Q3.
#así que las señales no son del todo claras.
#Sin atípicos.
par(mfrow = c(1,1))
#Análisis exploratorio bivariado
R2 = cor(Salinidad[, c("Biomasa", "pH", "Salinidad", "Zinc", "Potasio")])^2
round(R2, 3)
## Biomasa pH Salinidad Zinc Potasio
## Biomasa 1.000 0.861 0.004 0.611 0.005
## pH 0.861 1.000 0.002 0.519 0.001
## Salinidad 0.004 0.002 1.000 0.182 0.000
## Zinc 0.611 0.519 0.182 1.000 0.006
## Potasio 0.005 0.001 0.000 0.006 1.000
#pH: explica casi toda la variación de la biomasa. Queda un 13.9% sin explicar, que es la dispersión de los puntos alrededor de la recta.
#Zinc: también explica mucho, pero unos 25 puntos porcentuales menos que el pH.
#Salinidad y potasio: explican menos del 1%. Con 45 muestras, un R^2 tan bajo no es significativo. No sirve para predecir la biomasa.
ggplot(Salinidad, aes(x=pH, y=Biomasa)) + geom_point() + geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
#Los puntos siguen la recta de cerca y el intervalo de confianza del 95% es angosta, es decir, recta bien estimada de poca incertidumbre.
#A mayor pH, mayor biomasa.
#El pH explica cerca del 86% de la biomasa (R^200.86), este dato se confirma más abajo.
ggplot(Salinidad, aes(x=Zinc, y=Biomasa)) + geom_point() + geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
#La relación es negativa: a más Zinc, menos biomasa. Su R^2=0.61 es fuerte, pero más dispersa que la del pH.
#Entre Zinc 10 y 31 los puntos bajan con más dispersión, y uno con Zinc ^20 y biomasa ~1890 destaca por encima.
#Parte de esta relación puede ser indirecta: pH y Zinc están correlacionados entre sí (R^2=-0.72), y son las mismas muestras
#en el extresmo. No se puede decir que el Zinc reduzca la biomasa. Solo que ambas varían juntas.
ggplot(Salinidad, aes(x=Salinidad, y=Biomasa)) + geom_point() + geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
#La recta es casi horizontal y el intervalo de confianza es muy ancho.No se distingue el cero.
#Los puntos forman columnas verticales porque la salinidad solo toma valores enteros. En cada columna hay biomasas muy distintas: con
#salinidad 30, van de unos 370 a más de 2300 g.
#La salinidad no explica la biomasa en este conjunto de datos.
ggplot(Salinidad, aes(x=Potasio, y=Biomasa)) + geom_point() + geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
#Tampoco hay tendencia: recta casi plana y banda ancha que incluye la horizontal.
#Se ven dos zonas: 5 puntos arriba a la izquierda (Potasio ~450-570, biomasa mayor a 2100) y muchos abajo con
#biomasa baja y Potasio parecido. Con Potasio ~500, la biomasa puede ser de 370 a 2337 g, así que el Potasio no
#sirve para predecirla.
#Categorizar, ANOVA y LSD
if ("pH_cat" %in% names(Salinidad)) Salinidad$pH_cat = NULL
cortes = quantile(Salinidad$pH, probs = c(0, 1/3, 2/3, 1))
cortes
## 0% 33.33333% 66.66667% 100%
## 3.200000 3.883333 4.900000 7.450000
cortes = quantile(Salinidad$pH, probs = c(0, 1/3, 2/3, 1))
cortes
## 0% 33.33333% 66.66667% 100%
## 3.200000 3.883333 4.900000 7.450000
pH_cat = cut(Salinidad$pH, breaks = cortes, include.lowest = TRUE,
labels = c("Bajo", "Medio", "Alto"))
table(pH_cat)
## pH_cat
## Bajo Medio Alto
## 15 15 15
#El pH se dividió en terciles porque da grupos de tamaño exactamente igual (15 cada uno), sin imponer cortes arbitrarios:
#Bajo(3.20 a 3.88), Medio(3.88 a 4.90) y Alto(4.90 a 7.45).
table1(~Biomasa|pH_cat, data = data.frame(Biomasa = Salinidad$Biomasa, pH_cat = pH_cat))
| Bajo (N=15) |
Medio (N=15) |
Alto (N=15) |
Overall (N=45) |
|
|---|---|---|---|---|
| Biomasa | ||||
| Mean (SD) | 593 (165) | 1050 (245) | 1610 (548) | 1080 (546) |
| Median [Min, Max] | 546 [370, 978] | 1040 [568, 1490] | 1420 [765, 2340] | 992 [370, 2340] |
#La biomasa media aumenta escalonadamente con el nivel de pH.
#En Bajo y Medio la media y la mediana casi coinciden (distribuciones simétricas); en Alto la media (1610) supera bastante
#a la mediana (1420), señal de asimetría positiva, coherente con las 5 muestras extremas (biomasa > 2100) que tiene este grupo.
ggplot(Salinidad, aes(x=pH_cat, y=Biomasa, fill=pH_cat)) + geom_boxplot()
#En el boxplot, las tres cajas casi no se tralapan y suben de izquierda a derecha. Bajo tiene un atípico leve (~978 g). La caja
#de Alto es mucho más ancha que las otras dos: va de ~1200 a ~2190, contra ~480-660 en Bajo y ~890-1200 en Medio. Esa diferencia
#de tamaño es la primera pista visual de que las varianzas no son iguales.
anova_sal = aov(Salinidad$Biomasa ~ pH_cat)
#H0: las medias de biomasa son iguales en los tres niveles de pH. H1: al menos un nivel difiere.
#Como p<0.05, se rechaza H0: el nivel de pH genera diferencias significativas en la biomasa.
summary(anova_sal)
## Df Sum Sq Mean Sq F value Pr(>F)
## pH_cat 2 7712683 3856342 29.89 8.45e-09 ***
## Residuals 42 5418235 129006
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
shapiro.test(residuals(anova_sal))
##
## Shapiro-Wilk normality test
##
## data: residuals(anova_sal)
## W = 0.97316, p-value = 0.3749
#H0: los residuales siguen una distribución normal, Como p>0.05, no s rechaza H0: el supuesto se cumple.
qqnorm(residuals(anova_sal)); qqline(residuals(anova_sal))
#El Q-Qplot lo confirma: la mayoría de los puntos, sobre todo en el centro, sigue de cerca la recta. hay una desviación leve en ambas colas
#algunos puntos por debajo de la recta a la izquierda y por encima a la derecha), lo que indica colas un poco más pesadas que una normal perfecta, pero no
#lo suficiente como para que Shapiro lo detecte como anormal. Es un resultado coherente y no contradictorio.
bartlett.test(Salinidad$Biomasa ~ pH_cat)
##
## Bartlett test of homogeneity of variances
##
## data: Salinidad$Biomasa by pH_cat
## Bartlett's K-squared = 20.084, df = 2, p-value = 4.353e-05
leveneTest(Salinidad$Biomasa ~ pH_cat)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 8.6753 0.000702 ***
## 42
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#H0: las tres varianzas son iguales. Ambas pruebas dan p<0.05, así que se rechaza H0 en las dos: el supuesto no se cumple.
#Que las dos pruebas coincidan le da más fuerza a la conclusión: no es un artefacto de una sola prueba.
#La causa se ve en las DE: 165(Bajo), 245(Medio) y 548(Alto). El grupo Alto es 3.3 veces más variable que bajo, porque mezcla pH "normales" (5-5.6) con el grupo
#aparte de pH mayor a 7 (biomasa 2160.2337).
oneway.test(Salinidad$Biomasa ~ pH_cat)
##
## One-way analysis of means (not assuming equal variances)
##
## data: Salinidad$Biomasa and pH_cat
## F = 34.727, num df = 2.000, denom df = 24.736, p-value = 6.58e-08
#El resultado confirma al ANOVA clásico que el pH afecta la biomasa.
LSD.test(anova_sal, "pH_cat", console = TRUE)
##
## Study: anova_sal ~ "pH_cat"
##
## LSD t Test for Salinidad$Biomasa
##
## Mean Square Error: 129005.6
##
## pH_cat, means and individual ( 95 %) CI
##
## Salinidad.Biomasa std r se LCL UCL Min
## Alto 1605.3853 547.6014 15 92.7382 1418.2321 1792.5386 765.280
## Bajo 593.0233 164.8299 15 92.7382 405.8701 780.1766 369.823
## Medio 1048.1093 244.9093 15 92.7382 860.9560 1235.2625 568.455
## Max Q25 Q50 Q75
## Alto 2337.326 1200.2575 1422.836 2192.560
## Bajo 977.515 481.3520 545.538 659.713
## Medio 1491.276 890.8515 1039.637 1198.396
##
## Alpha: 0.05 ; DF Error: 42
## Critical Value of t: 2.018082
##
## least Significant Difference: 264.6747
##
## Treatments with the same letter are not significantly different.
##
## Salinidad$Biomasa groups
## Alto 1605.3853 a
## Medio 1048.1093 b
## Bajo 593.0233 c
#Letras distintas para los tres grupos dignifica que los tres niveles de pH difieren significativamente entre sí.
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.