El objetivo principal de este análisis es predecir la probabilidad de encontrar poblaciones de anfibios, específicamente ranas marrones (Brown frogs), en distintas zonas evaluadas en el contexto de estudios de impacto ambiental realizados antes de la construcción de dos carreteras en Polonia. Para ello, se desarrolla un modelo estadístico basado en variables ambientales como la distancia al camino, el tipo de cobertura terrestre y las características de la vegetación circundante.
Esta predicción resulta crucial para anticipar los posibles efectos ecológicos derivados de las obras viales, ya que permite identificar áreas de alta probabilidad de presencia de anfibios, consideradas zonas sensibles desde el punto de vista de conservación. De este modo, se facilita la toma de decisiones más informadas por parte de autoridades ambientales, promoviendo medidas de mitigación adecuadas como pasos de fauna, cambios en el trazado o restricciones durante temporadas reproductivas.
dataset <- read.csv2("C:/Users/valen/OneDrive/Escritorio/dataset.csv", header = TRUE)
dataset <- dataset[-1, ]
dataset <- subset(dataset, Categorical == "A1")
dataset$BrownFrog <- ifelse(dataset$Label.2 == "1", "1", "0")
Del total de más de 20 variables presentes en la base, se seleccionaron solo aquellas consideradas ecológicamente relevantes y comprensibles para el análisis:
Numerical → Distancia
Categorical.1 → Cobertura
Categorical.7 → Vegetación
Label.2 → Variable binaria BrownFrog
Estas variables se agruparon en un nuevo dataframe llamado datos_utiles y para facilitar la interpretacion fueron renombradas que originalmente venían en formato numérico.
datos_utiles <- dataset[, c("Numerical", "Categorical.1", "Categorical.7", "Label.2")]
colnames(datos_utiles) <- c("Distancia", "Cobertura", "Vegetacion", "BrownFrog")
datos_utiles$Cobertura <- factor(datos_utiles$Cobertura,
levels = c("1", "11", "12", "14", "15", "2", "5", "7"),
labels = c("Bosque natural", "Plantación forestal", "Cultivo agrícola", "Humedal",
"Zona urbana", "Pastizal", "Área abierta", "Cuerpo de agua")
)
datos_utiles$Vegetacion <- factor(datos_utiles$Vegetacion,
levels = c("0", "1", "2", "3", "4"),
labels = c("Sin vegetación", "Bordes delgados", "Moderada cobertura",
"Vegetación densa", "Completamente cubierto")
)
datos_utiles$BrownFrog <- factor(datos_utiles$BrownFrog,
levels = c("0", "1"),
labels = c("Ausente", "Presente"))
head(datos_utiles)
| Distancia | Cobertura | Vegetacion | BrownFrog | |
|---|---|---|---|---|
| 2 | 600 | Bosque natural | Sin vegetación | Ausente |
| 3 | 700 | Área abierta | Bordes delgados | Presente |
| 4 | 200 | Área abierta | Completamente cubierto | Presente |
| 5 | 300 | Área abierta | Completamente cubierto | Ausente |
| 6 | 600 | Bosque natural | Sin vegetación | Presente |
| 7 | 200 | Área abierta | Sin vegetación | Ausente |
En este análisis se seleccionaron únicamente cuatro variables del conjunto original, enfocadas en los factores más relevantes para predecir la presencia o ausencia de la rana marrón (Brown Frog), con el fin de simplificar el modelo. Las variables elegidas fueron:
Distancia: distancia mínima desde el sitio al camino más cercano (en metros).
Cobertura: tipo de uso del suelo o cobertura dominante alrededor del sitio.
Vegetación: grado de cobertura vegetal dentro del cuerpo de agua.
BrownFrog: variable binaria dependiente, que indica la presencia (1) o ausencia (0) de la especie.
library(knitr)
# Mostrar la tabla sin mostrar los NA visualmente
kable(replace(summary(datos_utiles), is.na(summary(datos_utiles)), ""),
caption = "Resumen general de los datos")
| Distancia | Cobertura | Vegetacion | BrownFrog | |
|---|---|---|---|---|
| Length:80 | Bosque natural :48 | Sin vegetación :55 | Ausente :30 | |
| Class :character | Cultivo agrícola :12 | Bordes delgados : 6 | Presente:50 | |
| Mode :character | Área abierta : 9 | Moderada cobertura : 6 | ||
| Plantación forestal: 4 | Vegetación densa : 5 | |||
| Humedal : 3 | Completamente cubierto: 8 | |||
| Pastizal : 3 | ||||
| (Other) : 1 |
Se realizó un resumen estadístico de las variables seleccionadas para el modelo, lo cual permitió identificar la distribución y frecuencia de cada categoría.
Distancia: Corresponde a la distancia mínima entre el sitio y la carretera, y cuenta con 189 observaciones. Actualmente está codificada como texto, por lo que será necesario convertirla a variable numérica para su análisis.
Cobertura: La categoría más común del entorno es el Bosque natural con 116 sitios, seguido por Cultivo agrícola (23), Zona urbana (19), y otras coberturas menos frecuentes como Humedal, Área abierta y Plantación forestal.
Vegetación: Predomina la categoría Sin vegetación con 125 sitios. Las demás clases, como Bordes delgados, Vegetación densa y Completamente cubierto, se distribuyen de forma más uniforme entre 15 y 18 registros.
BrownFrog: Es la variable objetivo del modelo. Se observa que en 148 sitios se reporta presencia de ranas marrones (Presente), y en 41 sitios se reporta su ausencia (Ausente), lo cual indica un desequilibrio leve hacia la clase positiva.
ggplot(datos_utiles, aes(x = BrownFrog, y = as.numeric(Distancia), fill = BrownFrog)) +
geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.size = 2) +
scale_y_log10() +
labs(
title = "Distancia vs Presencia",
x = "Presencia de Brown frogs",
y = "Distancia al camino (log10)"
) +
scale_fill_manual(values = c("Ausente" = "#F8766D", "Presente" = "#00BFC4")) +
theme_minimal()
Para visualizar adecuadamente la relación entre la distancia al camino y la presencia de Brown frogs, se aplicó una transformación logarítmica (log10) a la variable Distancia. Esto se debió a que los valores originales presentaban un rango muy amplio, con algunas observaciones extremadamente altas que distorsionaban la escala del gráfico.
El gráfico de caja compara la distancia al camino (en escala logarítmica base 10) con la presencia o ausencia de ranas marrones (Brown frogs). Se observa que,las ranas aparecen en sitios que tienden a estar más alejados del camino, porque, en promedio, la distancia es un poco mayor en los sitios donde hay ranas que en los que no hay.
Además, la dispersión de los datos es mucho mayor en los sitios con presencia, lo que indica que las ranas marrones pueden encontrarse en una variedad más amplia de distancias.
ggplot(datos_utiles, aes(x = Cobertura, fill = BrownFrog)) +
geom_bar(position = "fill") +
labs(
title = "Cobertura vs Presencia",
x = "Tipo de cobertura",
y = "Proporción"
) +
scale_fill_manual(values = c("Ausente" = "#F8766D", "Presente" = "#00BFC4")) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
La gráfica muestra cómo varía la presencia y ausencia de ranas marrones en diferentes tipos de cobertura del suelo. Cada barra representa un tipo de cobertura y su altura está dividida en proporciones de sitios con presencia y ausencia de la especie.
Se observa que, En coberturas como humedal y zona urbana, la presencia de ranas es alta (proporción mayor a 75%). En comparacion con bosque natural, pastizal y área abierta, la proporción de ausencia es más alta o está equilibrada, indicando que estos hábitats pueden ser menos favorables.
En general, las coberturas más naturales o húmedas tienden a tener mayor proporción de presencia, lo cual es ecológicamente coherente, esto significa que el tipo de cobertura del entorno influye en la presencia de ranas marrones.
ggplot(datos_utiles, aes(x = Vegetacion, fill = BrownFrog)) +
geom_bar(position = "dodge") +
scale_y_log10() + # Aplica escala logarítmica
labs(
title = "Vegetación vs Presencia",
x = "Tipo de vegetación",
y = "Cantidad de sitios (log10)",
fill = "Presencia"
) +
scale_fill_manual(values = c("Ausente" = "#F8766D", "Presente" = "#00BFC4")) +
theme_minimal(base_size = 13) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold", hjust = 0.5)
)
Se utilizó una escala logarítmica en el eje Y debido a la alta variabilidad en las frecuencias, lo cual permitió una visualización más clara de las diferencias.
Se observa que la categoría “Sin vegetación” es la más frecuente, especialmente en sitios donde se detectó presencia de ranas. Esta tendencia demuestra que la ausencia de vegetación no representa una barrera para la especie, e incluso podría estar asociada a condiciones favorables como accesibilidad al cuerpo de agua.
Por otro lado, se destaca que en casi todos los tipos de vegetación, los sitios con presencia de ranas superan a los de ausencia, lo cual sugiere que la vegetación no limita su presencia, e incluso podrían preferir ambientes menos cubiertos. Teniendo en cuenta que en zonas con vegetación densa no se registró presencia de ranas marrones, esto quiere decir que podrían evitar este tipo de cobertura.
datos_utiles$Distancia <- as.numeric(datos_utiles$Distancia)
modelo <- glm(BrownFrog ~ Distancia + Cobertura + Vegetacion,
data = datos_utiles,
family = "binomial")
modelo_resumen <- summary(modelo)
tabla_modelo <- data.frame(modelo_resumen$coefficients)
knitr::kable(tabla_modelo, caption = "Coeficientes del modelo logístico")
| Estimate | Std..Error | z.value | Pr…z.. | |
|---|---|---|---|---|
| (Intercept) | 0.4202057 | 0.3707050 | 1.1335312 | 0.2569912 |
| Distancia | -0.0000071 | 0.0000213 | -0.3313451 | 0.7403839 |
| CoberturaPlantación forestal | 0.6798209 | 1.2124325 | 0.5607082 | 0.5749964 |
| CoberturaCultivo agrícola | 0.7344510 | 0.7646273 | 0.9605347 | 0.3367862 |
| CoberturaHumedal | 16.1479840 | 1385.3778389 | 0.0116560 | 0.9907001 |
| CoberturaZona urbana | 16.1479840 | 2399.5447479 | 0.0067296 | 0.9946306 |
| CoberturaPastizal | -0.0562427 | 1.4093235 | -0.0399076 | 0.9681668 |
| CoberturaÁrea abierta | -0.9334866 | 0.7857064 | -1.1880858 | 0.2347996 |
| VegetacionBordes delgados | 0.6253658 | 0.9747050 | 0.6415950 | 0.5211362 |
| VegetacionModerada cobertura | 0.5589956 | 1.0693819 | 0.5227277 | 0.6011637 |
| VegetacionVegetación densa | -1.7550166 | 1.1761465 | -1.4921751 | 0.1356533 |
| VegetacionCompletamente cubierto | 0.3962034 | 0.8389704 | 0.4722496 | 0.6367486 |
Se transformó la variable Distancia a numérica para que el modelo la tratara como continua y no como categorías separadas, evitando generar un modelo innecesariamente complejo.
prob <- modelo$fitted.values
predicho <- prob > 0.5
real <- datos_utiles$BrownFrog == "Presente"
matriz_confusion <- table(Predicho = predicho, Real = real)
# Mostrar tabla bonita
knitr::kable(matriz_confusion)
| FALSE | TRUE | |
|---|---|---|
| FALSE | 8 | 3 |
| TRUE | 22 | 47 |
Verdaderos Positivos (VP): 47 Casos donde el modelo predijo Presente y efectivamente había ranas marrones.
Falsos Positivos (FP): 22 Casos donde el modelo predijo Presente, pero no había ranas marrones.
Total de predicciones positivas (VP + FP): 47 + 22 = 69
Falsos Negativos (FN): 3 Casos donde el modelo predijo Ausente, pero sí había ranas marrones.
Verdaderos Negativos (VN): 8 Casos donde el modelo predijo Ausente y efectivamente no había ranas marrones.
Total de predicciones negativas(VN + FN): 8 + 3 = 11
Esta fórmula calcula la exactitud del modelo, es decir,indica la proporción de aciertos del modelo.
\[ \frac{VP + VN}{Total} = \frac{47 + 8}{80} = 0.6875 \]
El modelo acertó en el 68.75% de las predicciones.
Capacidad del modelo para detectar correctamente los casos positivos reales (ranas marrones estaban presentes).
\[ \frac{VP}{\text{Total positivos}} = \frac{47}{50} = 0.94 \]
El 94% de los sitios con presencia real de ranas marrones fueron correctamente identificados por el modelo.
Capacidad del modelo para detectar correctamente los casos negativos reales (ranas marrones no estaban presentes).
\[ \frac{VN}{\text{Total negativos}} = \frac{8}{30} = 0.2667 \]
Acertó en el 26.67% de los casos donde Brown frogs no estaban presentes.
Predecir la probabilidad de la presencia de Brown frogs en un sitio cobertura de bosque natural, vegetación densa y una distancia promedio al camino.
predict(modelo,
newdata = data.frame(
Distancia = median(as.numeric(datos_utiles$Distancia), na.rm = TRUE),
Cobertura = "Bosque natural",
Vegetacion = "Vegetación densa"
),
type = "response")
## 1
## 0.2076076
El modelo estimó una probabilidad de presencia del 20,7%, lo que indica una probabilidad del 79,3% de ausencia de ranas marrones bajo estas condiciones.
Presente → 20.76%
Ausente → 1 − 0.2076 = 79.24%
El modelo desarrollado está listo para ser integrado en una aplicación web, la cual permitirá a usuarios ingresar parámetros ambientales como cobertura y tipo de vegetacion, obteniendo una predicción estimada sobre la presencia de Brown frogs.
A continuación, puede interactuar con una demostración funcional de la aplicación web desarrollada:
Probar Aplicación Web de Predicción de Brown Frogs desde este enlace.