37 votos

El alce debe fluir, pero ¿cómo?

Antecedentes

Supongamos que he recopilado un conjunto de datos de la latitud y longitud de las huellas de alce dentro de un polígono irregular, y también tomé un rumbo de la dirección en la que apuntaban las pezuñas.

Crédito de la imagen: © Galen Seilis 2022 (utilizado con permiso)

También supongamos que la intensidad de muestreo espacial es aproximadamente uniforme. El área de estudio es lo suficientemente pequeña como para poder ignorar la curvatura de la Tierra, si se desea.

Esto nos acerca mucho a tener un campo vectorial sobre R2, solo que no hay una clara noción de magnitud. Para tener en cuenta esto, defino cada observación vi como el gradiente normalizado en ese punto del espacio de algún campo hipotético u:R2R.

enter image description here

Me gustaría asumir que no existen fuentes o sumideros en el gradiente del campo u. Esto se debe a que los alces entran y salen del área de estudio potencial. Si bien, por supuesto, los alces nacen y mueren en algún lugar, quiero asumir que estos eventos son lo suficientemente raros como para ser ignorados en mi modelo. Visualmente esto significa que ninguno de los dos patrones siguientes ocurre en ningún momento:

enter image description here

Debido a cómo definí las observaciones para ser el gradiente normalizado, estaba dispuesto a asumir que el gradiente no es el vector cero en ninguna parte de todos modos. Esto excluye otros patrones de campo también.


Otras Consideraciones

  • En este momento no tengo un problema bien planteado.
  • El objetivo es producir patrones plausibles de flujo de alces a través de un área pequeña.
  • A veces las huellas de alce son plausiblemente del mismo individuo debido a estar alineadas y cercanas entre sí, pero generalmente las huellas están relativamente aisladas.
  • Hay un montón de enfoques de aprendizaje automático que podría usar para estimar un mapa R2R2, pero preferiría usar ecuaciones diferenciales para la comprensibilidad.
  • En un punto de borde, el gradiente de u podría ser perpendicular, paralelo, o ninguno al propio borde.
  • No estoy modelando la dependencia temporal porque estimar la edad de una huella es bastante difícil.
  • He empezado asumiendo que es una función en lugar de una función multivaluada, pero un vector aleatorio es una forma razonable de proceder. Lo primero podría funcionar si en la práctica las huellas superpuestas parcialmente no están exactamente una sobre la otra. Pero lo segundo tiene sentido en el sentido de que un alce dado podría ir en diferentes direcciones desde el mismo punto dependiendo de detalles no modelados de su entorno, o que alces distintos podrían tener cerebros o percepciones diferentes y en consecuencia decidir caminar en direcciones diferentes desde el mismo punto. El punto de Frank sobre los cruces de caminos es excelente: es decir, que la probable existencia de cruces de caminos impide la existencia de un campo vectorial de una sola valor.
  • No he decidido qué es razonable asumir sobre la rotación; voy a pensar más en ello. Como señaló Frank, la rotación del gradiente de un campo debe ser cero.
  • Las caminatas aleatorias en R2 podrían ser productivas. Cuanto más explicable, mejor, pero no me importa agregar un poco de ruido de un proceso estocástico.
  • El objetivo final es estimar caminos probables que los alces están tomando hacia adentro y luego fuera de la región delimitada.
  • Whuber plantea un buen punto de que los alces siguen caminos específicos. En teoría, no deberían haber vectores donde los alces no hayan ido. La dificultad es que no sabemos por dónde han pasado los alces, y deseamos inferirlo.
  • SextusEmpiricus sugirió que una formulación de flujo es prometedora para resolver el problema de los cruces de caminos.
  • Supongo que probablemente no haya alces en la región delimitada en un día dado. Lo que sospecho es que los alces ocasionalmente atraviesan el área mientras se alimentan.
  • A veces es posible saber si las huellas son 'extremadamente' frescas, pero en general las edades de las huellas no se adivinan de manera confiable (por lo menos por mí).

Pregunta

¿Qué modelo (y condiciones de frontera si corresponde) sería adecuado para modelar el flujo de alces a través de una región delimitada?

3voto

Ankur Loriya Puntos 160

Basándonos en la respuesta de Betterthan Kwora, aquí hay un enfoque posible.

Puedes ver tu campo vectorial como una función {(xi,yi)}1inR2[0,2π], porque cada vector alce tiene longitud unitaria. Puedes usar interpolación para extender esto a una función definida en todo R2, por ejemplo, usando funciones de base radial. Una vez que tengas este campo vectorial extendido, puedes simular posibles trayectorias.

Aquí hay una implementación de la idea en R. Primero, aquí hay una función para simular algunos datos. Por defecto, estos alces tienden a moverse de este a oeste:

simulate_moose <- function(N, x1=1, y1=1, a1=2, a2=2){
  # simular algunos datos en el rectángulo [0, x1] x [0, y1]
  # N: número de puntos de datos
  # a1, a2: parámetros de la distribución beta (dirección del alce sesgo)
  # por defecto, la "verdad" es que los alces se mueven hacia el oeste en este ejemplo

  # elegir punto inicial para cada vector
  x <- runif(N) * x1
  y <- runif(N) * y1

  # elegir una dirección para cada vector
  ángulos <- rbeta(N, a1, a2) * 2 * pi
  vx <- cos(ángulos)
  vy <- sin(ángulos)

  list(x=x, y=y, vx=vx, vy=vy)
}

Aquí hay una función para ajustar un campo vectorial a los datos de alces:

fit_vector_field <- function(moose_data, r=0.2){

  # ajustar el campo vectorial usando normales
  # r más grande = más suavizado

  x0 <- moose_data$x
  y0 <- moose_data$y
  vx0 <- moose_data$vx
  vy0 <- moose_data$vy

  # obtener ángulo de los valores vx y vy en los datos
  theta <- acos(vx0)
  theta[vy0 > 0] <- -theta[vy0 > 0]

  # convertir ángulos a número real en el rango (-infinito, infinito)
  z <- tan((theta - pi)/2)

  campo_ajustado <- function(x, y){
    # obtener pesos usando Gaussiana - invariante a rotaciones
    w <- (2 * pi * r^2)^-0.5 * exp(( -(x - x0)^2 -(y - y0)^2)/(2 * r^2))
    w <- w/sum(w)

    # usar los pesos para estimar la tangente del ángulo deseado en el punto deseado (x, y)
    z_est <- sum(w * z)

    # convertir de nuevo a un ángulo
    theta_est <- 2 * atan(z_est) + pi

    # convertir de ángulo a vector de dirección (vx, vy)
    list(vx=cos(theta_est), vy=sin(theta_est))
  }

  campo_ajustado
}

Aquí hay una función de trazado y un ejemplo:

plot_vector_field <- function(vector_field, vlength=1, ...){

  # trazar los datos de alces usando una cabeza circular para los vectores
  x <- vector_field$x
  y <- vector_field$y
  vx <- vector_field$vx * vlength
  vy <- vector_field$vy * vlength

  do.call(plot, c(list(x=x, y=y, xlab="", ylab="", cex=0), list(...)))
  for (i in 1:length(x)){
    segments(x[i], y[i], x[i] + vx[i], y[i] + vy[i])
    points(x[i] + vx[i], y[i] + vy[i], pch=19)
  }
}

simulate_moose_path <- function(fitted_field, start_x, start_y, N_steps, stepsize){

  # simular una trayectoria desde el punto de inicio (start_x, start_y)
  # usar N pasos de tamaño stepsize

  x <- y <- rep(0, N_steps)

  x[1] <- start_x
  y[1] <- start_y

  for (i in 2:N_steps){

    pred <- fitted_field(x[i-1], y[i-1])
    x[i] <- x[i-1] + pred$vx * stepsize
    y[i] <- y[i-1] + pred$vy * stepsize
  }
  list(x=x, y=y)
}

# ejemplo
set.seed(42)
moose_data <- simulate_moose(60)
fitted_field <- fit_vector_field(moose_data)
plot_vector_field(moose_data, vlength=0.1, xlim=c(-0.1, 1.1), ylim=c(-0.1, 1.1))
for (i in -1:5){
  for (j in -1:5){
    path <- simulate_moose_path(fitted_field, i/5, j/5, 50, 0.1)
    lines(path, col="blue", lwd=2)
  }
}

Los datos simulados: enter image description here y las trayectorias simuladas: enter image description here Quizás este enfoque ingenuo podría ser útil si deseas obtener una rápida comprobación de las trayectorias que obtienes de métodos más sofisticados/rigorosos.

2voto

colorant Puntos 51

Parece que puedes dividir esto en problemas separados.

Primero, puedes intentar inferir un vector de movimiento de alce para cada punto en tu polígono. Esto tomará la forma de aprender una función f:R2R2. Mejor aún, esta sería una función estocástica, generando una distribución de vectores de movimiento para cada ubicación.

Segundo, dado tu función f, puedes intentar inferir trayectorias probables. Para inferir trayectorias, simplemente las simularías (con muestreo, si tu función es estocástica), quizás con tus observaciones como puntos iniciales. Habría complicaciones relacionadas con la elección del tamaño del paso, pero en general esto no es difícil.

Tercero, necesitarías ajustar ecuaciones diferenciales a estas trayectorias. Dada una familia de EDOs con una cierta parametrización, la estimación de parámetros tampoco es tan difícil, con muchos enfoques posibles en la literatura.

2voto

Ferndinand Ursa Puntos 89

Densidad de alces

Mientras que otras respuestas han tomado enfoques más sofisticados, sugeriría ignorar los datos vectoriales por un momento - ¿significa tu muestreo que puedes estimar la densidad de alces (independientemente de la dirección) a partir de las pistas observadas? Eso en sí mismo será valioso.

Luego puedes agregar puntos de datos usando los vectores - si tienes tu conjunto de puntos X y vectores V, tienes una densidad inicial a partir de X en sí mismo, pero puedes enriquecer esto usando X unión X + V unión X - V. Esto puede funcionar mejor si los elementos de V no están normalizados, sin embargo.

Si tienes suficientes datos, también puedes estimar la densidad de los alces viajando en cada dirección, como un primer paso hacia los modelos de viento mencionados en otras respuestas - este tipo de enfoque no es elegante pero maneja 'datos contradictorios' sin conflicto.

1voto

Daniel Wagner Puntos 111

Una cosa que podrías considerar sería un modelo discreto. La idea es la siguiente: usando tus puntos de medición, haz un diagrama de Voronoi para dividir tu polígono en celdas. La medición de la dirección da como resultado un grafo dirigido en las celdas, ya que señala hacia una celda adyacente única, y podrías considerar que los alces viajen de manera determinista según lo prescrito por este grafo. (O, si quieres ser un poco más realista, podrías considerar alguna distribución de direcciones cuya moda sea la dirección medida, y considerar que los alces viajen de manera estocástica según el grafo ponderado resultante).

Una cosa buena acerca de esta formulación es que hace cumplir tu propiedad de "sin sumideros, sin fuentes": dado que cada celda tiene exactamente otra celda a la que "apunta", tus alces nunca se quedarán atascados sin direcciones a las que ir (un sumidero) y nunca sufrirán de parálisis de elección (una fuente). ¡Tus pobres alces memoriles podrían quedarse atascados vagando en un ciclo para siempre, sin embargo!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X