Introducción

El Melocactus intortus es un cactus distribuido principalmente en la zona Sur-Oeste de Puerto Rico. Las poblaciones del cactus se encuentran amenazadas por insectos que les producen daños y transmiten infecciones de hongos; además los seres humanos son un factor de amenaza para la especie. Estaremos analizando la distribución de los individuos en una población localizada en el Bosque Estatal de Guánica.

Metodología de campo

En este estudio estamos interesados en la ubicación de los individuos, su tamaño y longitud de la inflorescencia, y su estado. Para la localización de los individuos utilizamos el método de azimuto y distancia (equivalente a coordenadas polares). El tamaño de los individuos se mide como la altura desde el suelo al punto más alto del individuo. La inflorescencia se mide desde su base hasta el ápice de la misma. El estado de los individuos se categoriza en saludable, enfermo y muerto.

Análisis de los datos

Las coordenadas polares se transforman a coordenadas cartesiana utilizando las fórmulas para un triángulo rectángulo (seno y coseno). Los análisis para determinar el tipo de distribución y gráficas de los datos se realizarán utilizando R.

Cargar datos a data frame

# con datos csv usando paquete readr
library(readr)
melodata <- read_csv("melocactusGuanica2016.csv")
head(melodata)
## # A tibble: 6 × 6
##   cactus azimuto distancia altura_total inflo estado
##    <dbl>   <dbl>     <dbl>        <dbl> <dbl> <chr> 
## 1      1     350      4.96           45    17 S     
## 2      2     350      4.96           42    17 S     
## 3      3     351      6.31           40    18 X     
## 4      4     331      4.68           29     0 S     
## 5      5     315      9.2            26     0 E     
## 6      6     317      9.66           43    12 S
dim(melodata)
## [1] 113   6

Transformación de coordenadas polares a X y Y

Usamos las función seno y coseno para obtener coordenadas X y Y, respectivamente, a partir de los datos de azimuto y distancia. Las funciones trigonométricas requieren los ángulos en radianes y por eso debemos transformar los grados de azimuto a radianes, multiplicando por \(\pi / 180\).: \[X = Distancia * Seno(Azimuto * \pi / 180)\] \[Y = Distancia * Coseno(Azimuto * \pi / 180)\] Como algunas coordenadas resultarán en valores negativos, por provenir de azimutos mayores de 90º, es más conveniente parasarlas a valores positivos, sumando una cantidad a cada valor de X y Y, en nuestro caso 100.

library(dplyr)
melodata <- melodata %>% 
  mutate(Xtran = distancia * sin(azimuto * pi/180) + 100,
         Ytran = distancia * cos(azimuto * pi/180) + 100)

Visualización de los datos

plot(melodata$Xtran, melodata$Ytran, type = "p", asp=1)

Figura 1. Mapa de distribución de individuos de Melocactus intortus en el área de Bosque Enano del bosque de Guánica.

library(ggplot2)
melo = ggplot(melodata, aes(Xtran, Ytran, color = estado, size = altura_total)) +
  geom_point()
melo

Figura 2. Mapa de distribución de individuos de Melocactus intortus en el área de Bosque Enano del bosque de Guánica. Los colores indican el estado de los individuos (S: sano, E: enfermo, X: muerto) y el tamaño de los círculos es proporcional a la altura total (cm) de los individuos.

Patrón Espacial de Melocactus intortus

Crear matriz de distancias (Nearest Neighbor)

library(spatstat)
NN1 <- nndist(melodata$Xtran, melodata$Ytran)
NN1
##   [1] 0.00000000 0.00000000 1.35352634 1.61484761 0.56557656 0.56557656
##   [7] 1.98864549 1.98864549 1.54593752 0.48967934 0.43855319 0.43855319
##  [13] 0.44000000 2.39224860 1.61548301 0.87125526 0.00000000 0.00000000
##  [19] 0.00000000 0.03000000 0.00000000 0.00000000 0.00000000 0.00000000
##  [25] 1.60963662 0.00000000 0.00000000 3.97345461 0.42376124 1.10000000
##  [31] 1.10000000 0.32072016 1.52018537 0.42376124 1.31000000 1.31000000
##  [37] 2.17346700 2.19665333 1.69426113 0.36624927 0.36624927 1.21000000
##  [43] 0.85000000 0.97592925 0.97592925 0.85000000 1.02857469 0.00000000
##  [49] 0.00000000 1.02857469 1.18000000 1.18000000 1.12468933 1.12468933
##  [55] 2.09390227 2.08974076 2.08974076 0.20000000 0.16000000 0.16000000
##  [61] 0.54464915 0.14629477 0.14629477 0.94751968 0.54612222 0.19372504
##  [67] 0.36172290 0.19372504 0.34599838 0.27405276 0.25596096 0.25596096
##  [73] 2.06643372 0.54398126 0.54398126 0.78735116 0.02000000 0.02000000
##  [79] 0.29922389 0.49000000 0.14000000 0.14000000 0.28000000 0.28000000
##  [85] 0.59575895 0.04000000 0.04000000 1.31286130 1.09199668 1.08321681
##  [91] 1.84418409 0.52730871 0.52730871 6.07793484 2.25153329 5.64606397
##  [97] 6.30319956 1.92537195 1.92537195 0.00000000 0.00000000 2.95704858
## [103] 2.25153329 0.35000000 0.35000000 3.43528021 0.12310330 0.09933077
## [109] 0.09933077 0.42716264 0.10212302 0.10568886 0.18396822

Aplicar método del vecino más cercano

Utilizamos la metodología de Clark y Evans (1954):

\[\bar{r}_A = \frac{\sum r_i}{n}\] donde \(\bar{r}_A\) es la distancia media al vecino más cercano, \(r_i\) es cada distancia al vecino más cercano, y \(n\) la cantidad de puntos.

Calculamos la densidad de organismos \(\rho\):

\[\rho = \frac{n}{área\ de\ estudio}\]
La distancia esperada al vecino más cercano, \(\bar{r}_E\):
\[\bar{r}_E = \frac{1}{2\sqrt{\rho}}\]

Ahora podemos calcular el índice de agregación, \(R\):
\[R = \frac{\bar{r}_A}{\bar{r}_E}\]
De manera general, si el patrón espacial es al azar, entonces \(R\) = 1, cuando ocurre agregación \(R\) tiende a cero, y cuando el patrón es regular \(R\) se acerca al valor de 2.15.

Podemos realizar una prueba de hipótesis para \(H_0\): “el patrón de distribución es al azar y las distancias tienen una distribución normal”.

Calculamos el valor de \(z\) para las distancias observadas: \[z = \frac{\bar{r}_A - \bar{r}_E}{s_r}\]

El error estándar de la distancia esperada, (\(s_r\)), se obtiene de la geometría plana, y es:
\[s_r = \frac{0.26136}{\sqrt{n\rho}}\]

El valor de \(z\) calculado, se compara con el valor de la tabla de la distribución normal, correspondiente a un \(\alpha\) = 0.05, y si el valor calculado es mayor que el de la tabla, se puede rechazar la \(H_0\) de distribución al azar.

#sumatoria distancias NN
sd <- sum(NN1)
sprintf("Sumatoria de distancias: %.2f m", sd)
## [1] "Sumatoria de distancias: 106.05 m"
#número de distancias NN
n <- length(NN1)
sprintf("Número de distancias: %1.f",n)
## [1] "Número de distancias: 113"
#distancia media NN: rA
rA <- sd/n
sprintf("Distancia media: %.2f m",rA)
## [1] "Distancia media: 0.94 m"
#densidad real
#Ra: radio del circulo
Ra <- 25
N <- length(melodata$Xtran)
d <- N/(pi*Ra^2)
sprintf("Densidad real: %.3f individuos/m^2",d)
## [1] "Densidad real: 0.058 individuos/m^2"
#distancia nn esperada: rE
rE <- 1/(2*sqrt(d))
sprintf("Distancia esperada: %.2f m",rE)
## [1] "Distancia esperada: 2.08 m"
# R: indice de agregación
R <- rA/rE
sprintf("Indice de agregación: %.3f",R)
## [1] "Indice de agregación: 0.450"
#prueba de significancia Ho:random
#sr: error estandar de rE
sr <- 0.26136/sqrt(N*d)
sprintf("Error estándar de la distancia esperada: %.3f m",sr)
## [1] "Error estándar de la distancia esperada: 0.102 m"
z <- abs((rA - rE)/sr)
sprintf("Estadístico Z: %.3f",z)
## [1] "Estadístico Z: 11.179"
vc <- abs(qnorm(0.05))
sprintf("Valor crítico distribución normal (p=0.05): %.3f",vc)
## [1] "Valor crítico distribución normal (p=0.05): 1.645"

Relaciones morfométricas

Vamos a analizar la relación que hay entre el tamaño de la parte vegetativa del cactus y de la inflorescencia (parte reproductiva). Pero primero debemos restar el tamaño de la inflorescencia de la altura total de la planta.

# altura de parte vegetativa
melodata <- melodata %>% 
  mutate(vegeta = altura_total - inflo)
# grafica de puntos por estado
library(ggplot2)
ggplot(melodata, aes(x = vegeta, y = inflo, color = estado)) +
  geom_point() +
  xlab("Tamaño de la parte vegetativa, cm") +
  ylab("Tamaño de la inflorescencia, cm")

Hay muchas plantas que no tienen inflorescencia y nos enmascara la posible relación. Construimos un data frame para valores de tamaño de inflorescencia mayores que 0, y volvemos a construir la gráfica.

melodata_repro <- filter(melodata, inflo > 0)
# nueva gráfica
ggplot(melodata_repro, aes(x = vegeta, y = inflo, color = estado)) +
  geom_point() +
  xlab("Tamaño de la parte vegetativa, cm") +
  ylab("Tamaño de la inflorescencia, cm")