Introducción

La pregunta que se busca responder es:

¿Como varia la forma de dispersion de semillas de las plantas en relacion con el cambio de elevación?

En este análisis, se examina cómo varía la forma de dispersión de las plantas en relación con diferentes categorías de elevación en Chile. Se utilizaron datos de ocurrencia de especies (GBIF) y un modelo digital de elevación (DEM) para realizar este estudio.

En primer lugar se cargaran las librerias necesarias

library(rmarkdown)
## Warning: package 'rmarkdown' was built under R version 4.4.2
library(knitr)    
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library("rgbif")
## Warning: package 'rgbif' was built under R version 4.4.2
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
## Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
library(terra)
## terra 1.7.78
## 
## Adjuntando el paquete: 'terra'
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## The following object is masked from 'package:knitr':
## 
##     spin
library(ggplot2)

Luego definiremos el espacio de trabajo, en que esten los archivos que se iran llamando

#setwd("C:/Users/lenovo/Desktop")
#getwd()

Leo los datos de Rasgos de - Alfaro, E., Pérez-Tello, V., Acevedo, M., Ovalle, J., Segovia, R., & Craven, D. (2023). Rasgos-CL: A functional trait database of Chilean woody plants. Global Ecology and Biogeography, 32, 2072–2084. LINK - https://github.com/dylancraven/Rasgos-CL/tree/main

#LEO CSV RASGOS
rasgosCL<- read.csv("RasgosCL_aggregatedspp.csv", header = TRUE, sep = ",")
#View(rasgosCL)

#RENOMBRO COLUMNA
rasgosCL <- rasgosCL %>%
rename(species = accepted_species) #es renombrada dado que su simil en 
                                   #la de gbif se llama species y no accepted species
#FILTRO CARACTERISTICA DE INTERES y guardo
#La caracteristica de interes en este caso seria la forma de dispersion de semillas
rasgosFILTER<- rasgosCL %>%
filter(traitName == "Dispersal_syndrome_2")
#View(rasgos_filtrados)
write.csv(rasgosFILTER, "rasgosFILTER.csv", row.names = FALSE)
rasgos<- read.csv("rasgosFILTER.csv", header = TRUE, sep = ",")

Y ahora descargo datos de ocurrencia de gbif (no me resulto muy bien asi que al) final subi el que nos paso Joseba)

#BAJO DATOS PLANTAS CL

#occ<-occ_search(kingdomKey ="6",country = "CL",year="1990,2020")
#write.csv(occ$data, 'plantas.csv', row.names = FALSE)
#spp<- read.csv("plantas.csv", header = TRUE, sep = ",")
#View(spp)

spp<-read.csv("sf_spp.csv", header = TRUE, sep = ",")

Ahora para que la lista de especies que entrega Alfaro et al 2023 sea basicamente georreferenciada lo que hare es unir las dos listas Asi, a la lista de gbib le agrego una columna sobre la disperrcion (en este caso se llama traitValue) Asi, a cada punto georreferenciado sabeemos cual es su dispersion de semilla

#veo comunes
comun <- left_join(rasgos, spp, by = "species")
#view(comun)

#guardo
write.csv(comun, "comunes.csv", row.names = FALSE)
datos<- read.csv("comunes.csv", header = TRUE, sep = ",")
#view(datos)
#le doy un epsg
datos_ocurrencia <- datos %>%
  mutate(
    longitude = as.numeric(sub("c\\(([^,]+),.*", "\\1", geometry)),
    latitude = as.numeric(sub("c\\([^,]+,\\s*([^\\)]+)\\)", "\\1", geometry))
  ) %>%
  filter(!is.na(longitude) & !is.na(latitude))

         datos_sf <- st_as_sf(datos_ocurrencia, coords = c("longitude", "latitude"), crs = 32719)

Ahora leo el dem (el plan inicial era trabajo con los pisos vegetacionales, pero mas adelante no logre hacer la interseccion)

#Leo pisos vegetacionales
#Pisos <- read_sf("PisosVegetacionalesPliscoff2017.shp")|>
 # st_transform(crs=32719)

#leo dem
demCH <- rast("dem_chile_180.tif") 
print(crs(demCH))
## [1] "GEOGCRS[\"WGS 84\",\n    ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n        MEMBER[\"World Geodetic System 1984 (Transit)\"],\n        MEMBER[\"World Geodetic System 1984 (G730)\"],\n        MEMBER[\"World Geodetic System 1984 (G873)\"],\n        MEMBER[\"World Geodetic System 1984 (G1150)\"],\n        MEMBER[\"World Geodetic System 1984 (G1674)\"],\n        MEMBER[\"World Geodetic System 1984 (G1762)\"],\n        MEMBER[\"World Geodetic System 1984 (G2139)\"],\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]],\n        ENSEMBLEACCURACY[2.0]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    USAGE[\n        SCOPE[\"Horizontal component of 3D system.\"],\n        AREA[\"World.\"],\n        BBOX[-90,-180,90,180]],\n    ID[\"EPSG\",4326]]"
crs(demCH) <- "EPSG:32719"
print(demCH)
## class       : SpatRaster 
## dimensions  : 24143, 27152, 1  (nrow, ncol, nlyr)
## resolution  : 0.001616968, 0.001616968  (x, y)
## extent      : -109.4574, -65.55348, -56.53727, -17.49882  (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 19S (EPSG:32719) 
## source      : dem_chile_180.tif 
## name        :  DEM_mean 
## min value   : -139.7999 
## max value   : 6863.9917

aca lo que hice en pisos

####pisos, no funciona
#datos_completos <- st_join(datos_sf, Pisos, join = st_within)
#print(head(datos_completos))
# Contar la frecuencia de síndromes de dispersión por piso vegetacional
#resultado <- datos_completos %>%
#  group_by(codigo, traitValue) %>%  # Cambia 'piso_vegetacional' y 'dispersal_syndrome' según corresponda
 # summarise(frecuencia = n(), .groups = "drop") %>%
#  arrange(codigo, desc(frecuencia))  # Ordenar por piso y frecuencia
#print(resultado)

y ahora para hacer la interseccion

#Extraer la elevación para cada punto de ocurrencia
datos_sf$elevation <- extract(demCH, st_coordinates(datos_sf))
print(str(datos_sf$elevation))
## 'data.frame':    63117 obs. of  1 variable:
##  $ DEM_mean: num  134 328 554 308 362 ...
## NULL
datos_sf$elevation <- as.numeric(unlist(datos_sf$elevation)) #ver que es numerico
if (any(is.na(datos_sf$elevation))) {
  warning("Hay valores NA en la columna 'elevation' después de la conversión.")
}
## Warning: Hay valores NA en la columna 'elevation' después de la conversión.
limites <- c(-Inf, 500, 1000, 1500, 2000, Inf) #definir limites de elevacion y luego categoriazar
datos_sf$elevation_category <- cut(datos_sf$elevation, breaks = limites, 
                                    labels = c("Baja", "Media Baja", "Media", "Media Alta", "Alta"), 
                                    include.lowest = TRUE)
if (!"traitValue" %in% colnames(datos_sf)) {
  stop("La columna 'traitValue' no se encuentra en datos_sf.")
}
# Contar la frecuencia por categoría de elevación y síndrome de dispersión
resultado <- datos_sf %>%
  group_by(elevation_category, traitValue) %>%
  summarise(frecuencia = n(), .groups = "drop") %>%
  arrange(elevation_category, desc(frecuencia))  # Ordenar por categoría y frecuencia
print(resultado)
## Simple feature collection with 30 features and 3 fields
## Geometry type: GEOMETRY
## Dimension:     XY
## Bounding box:  xmin: -80.77877 ymin: -55.97 xmax: -66.9333 ymax: -17.66202
## Projected CRS: WGS 84 / UTM zone 19S
## # A tibble: 30 × 4
##    elevation_category traitValue frecuencia                             geometry
##    <fct>              <chr>           <int>                     <MULTIPOINT [m]>
##  1 Baja               Zoochory        21905 ((-80.77877 -33.76604), (-80.76737 …
##  2 Baja               Anemochory      10659 ((-75.30703 -46.82215), (-75.307 -4…
##  3 Baja               Barochory        1875 ((-74.55 -49.15), (-74.31431 -43.14…
##  4 Baja               Autochory         597 ((-73.683 -41.4), (-73.32233 -37.39…
##  5 Baja               Hydrochory        430 ((-74.1892 -42.51554), (-74.13161 -…
##  6 Media Baja         Zoochory         7839 ((-78.86667 -33.63333), (-78.85194 …
##  7 Media Baja         Anemochory       4207 ((-74.7833 -49.5), (-74.07056 -42.3…
##  8 Media Baja         Barochory         855 ((-73.56667 -40.11667), (-73.5 -40.…
##  9 Media Baja         Autochory         744 ((-72.83852 -37.84335), (-72.53111 …
## 10 Media Baja         Hydrochory         31 ((-73.69923 -40.95807), (-73.65 -40…
## # ℹ 20 more rows
# Para encontrar la forma de dispersión dominante por categoría de elevación
dominante <- resultado %>%
  group_by(elevation_category) %>%
  slice(1)  # Selecciona el primer resultado (el más frecuente)

# Verificar el resultado final
print(dominante)
## Simple feature collection with 6 features and 3 fields
## Geometry type: MULTIPOINT
## Dimension:     XY
## Bounding box:  xmin: -80.77877 ymin: -55.97 xmax: -66.9333 ymax: -17.66202
## Projected CRS: WGS 84 / UTM zone 19S
## # A tibble: 6 × 4
## # Groups:   elevation_category [6]
##   elevation_category traitValue frecuencia                              geometry
##   <fct>              <chr>           <int>                      <MULTIPOINT [m]>
## 1 Baja               Zoochory        21905 ((-80.77877 -33.76604), (-80.76737 -…
## 2 Media Baja         Zoochory         7839 ((-78.86667 -33.63333), (-78.85194 -…
## 3 Media              Zoochory         4384 ((-73.67161 -50.19356), (-73.52357 -…
## 4 Media Alta         Zoochory         1163 ((-73 -46.66667), (-72.49469 -43.390…
## 5 Alta               Zoochory         1041 ((-72.5 -41.1), (-72.03538 -39.92772…
## 6 <NA>               Zoochory          790 ((-79.25 -35.85), (-78.97997 -33.659…

segun entiendo deberia estar listo, perooo, faltan las tablas y graficos

Primero, una tabla de resumen

# Contar la frecuencia por categoría de elevación y traitValue
resultado <- datos_sf %>%
  group_by(elevation_category, traitValue) %>%
  summarise(frecuencia = n(), .groups = "drop") %>%
  arrange(elevation_category, desc(frecuencia))

# Mostrar tabla resumen
print(resultado)
## Simple feature collection with 30 features and 3 fields
## Geometry type: GEOMETRY
## Dimension:     XY
## Bounding box:  xmin: -80.77877 ymin: -55.97 xmax: -66.9333 ymax: -17.66202
## Projected CRS: WGS 84 / UTM zone 19S
## # A tibble: 30 × 4
##    elevation_category traitValue frecuencia                             geometry
##    <fct>              <chr>           <int>                     <MULTIPOINT [m]>
##  1 Baja               Zoochory        21905 ((-80.77877 -33.76604), (-80.76737 …
##  2 Baja               Anemochory      10659 ((-75.30703 -46.82215), (-75.307 -4…
##  3 Baja               Barochory        1875 ((-74.55 -49.15), (-74.31431 -43.14…
##  4 Baja               Autochory         597 ((-73.683 -41.4), (-73.32233 -37.39…
##  5 Baja               Hydrochory        430 ((-74.1892 -42.51554), (-74.13161 -…
##  6 Media Baja         Zoochory         7839 ((-78.86667 -33.63333), (-78.85194 …
##  7 Media Baja         Anemochory       4207 ((-74.7833 -49.5), (-74.07056 -42.3…
##  8 Media Baja         Barochory         855 ((-73.56667 -40.11667), (-73.5 -40.…
##  9 Media Baja         Autochory         744 ((-72.83852 -37.84335), (-72.53111 …
## 10 Media Baja         Hydrochory         31 ((-73.69923 -40.95807), (-73.65 -40…
## # ℹ 20 more rows

Ahora graficos Gráfico 1: Frecuencia de TraitValue por Categoría de Elevación

library(ggplot2)  # Asegúrate de que ggplot2 esté cargado

# Verificar que 'resultado' tenga datos
if (exists("resultado") && nrow(resultado) > 0) {
  ggplot(resultado, aes(x = elevation_category, y = frecuencia, fill = traitValue)) +
    geom_bar(stat = "identity", position = "dodge") +
    theme_minimal() +
    labs(title = "Frecuencia de TraitValue por Categoría de Elevación",
         x = "Categoría de Elevación",
         y = "Frecuencia")
} else {
  stop("El objeto 'resultado' no está definido o está vacío.")
}
## Error in render(x, visible = TRUE, envir = parent.frame()): los argumentos no fueron usados (visible = TRUE, envir = parent.frame())

Gráfico x: Distribución de Elevaciones (me sirvio para reestructurar las categorias )

ggplot(datos_sf, aes(x = elevation)) +
  geom_histogram(binwidth = 100, fill="blue", color="white") +
  theme_minimal() +
  labs(title = "Distribución de Elevaciones",
       x = "Elevación (m)",
       y = "Frecuencia")
## Error in render(x, visible = TRUE, envir = parent.frame()): los argumentos no fueron usados (visible = TRUE, envir = parent.frame())

Gráfico 3: Boxplot por TraitValue

ggplot(datos_sf, aes(x = traitValue, y = elevation)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Boxplot de Elevación por TraitValue",
       x = "Trait Value",
       y = "Elevación (m)")
## Error in render(x, visible = TRUE, envir = parent.frame()): los argumentos no fueron usados (visible = TRUE, envir = parent.frame())

Gráfico 4: Frecuencia de TraitValue por Categoría de Elevación

ggplot(resultado, aes(x = elevation_category, y = frecuencia, fill = traitValue)) +
  geom_bar(stat = "identity", position = "stack") +  # Cambiado a 'stack' para apilar
  theme_minimal() +
  labs(title = "Frecuencia de TraitValue por Categoría de Elevación",
       x = "Categoría de Elevación",
       y = "Frecuencia") +
  scale_fill_brewer(palette = "Set1")  
## Error in render(x, visible = TRUE, envir = parent.frame()): los argumentos no fueron usados (visible = TRUE, envir = parent.frame())

Respuesta a la Pregunta Planteada

La forma de dispersión dominante parece no variar según las categorías de elevación. Los resultados muestran que para todas las categorias de altitud la forma de dispersion de semillas dominante es la zoocoria, seguido por la anemocoria.

Conclusion

Respecto a la descripcion y analisis de procedimientos

En un aspecto mas tecnico podria seññalarse en primer lugar que se tuvieron que hacer dos cambios, no pude usar los pisos vegetacionales y tuve dificultades al descargar datos de gbif

Es posible que la cercania a centros urbanos influya en los resultados, dado que se usaron datos de gbif

A pesar de que la idea del trabajo era usar grandes volumenes de datos, creo que entendiendo que especie hay en cada piso o en cada altitud se podria responder de mejor forma a la pregunta, era el plan original al usar los pisos, pero no salio

No se hicieron pruebas de diferencia de medias para determinar diferencias significativas entre una o otra, pero es posible que no haya diferencia

Al final la unica conclusion biologica que se puede mencionar es que las especies que presentan zoocoria son las que presentan mayores observaciones