7 votos

Cómo probar si la estructura social no es aleatoria y que se deriven de una relación genética – y cómo lidiar con la demografía efecto

Estoy tratando de construir (grafo) de la red social basada en la co-ocurrencia de los individuos. Algoritmo de Clustering se aplicó más tarde en esta red para encontrar algunos de los distintos subgrupos. Problema es que estudió las especies animales tiene muy corta longevidad (o más bien muy alta mortalidad debido a los depredadores). Ello hace que no todas las relaciones en mi red puede haber existido al mismo tiempo. Si nos fijamos en el diagrama de abajo, el "rojo" los individuos son casi extinto después de 3-4 años*, pero tienen el "más largo" tiempo a "conocer"a otras personas, mientras que el "blue" los individuos tienen sólo dos años para "satisfacer" a los demás.

enter image description here

En teoría puedo asumir que cada individuo tiene longevidad espera menos de 10 años. Por lo tanto, no la captura de la "roja" de 5 o 6 años después de la marcación no necesariamente significa que está muerto.

Cómo incluir este efecto del tiempo en la red social?

Preguntas específicas quiero contestar: Primera pregunta: Se observan las conexiones sociales distintas de una de las conexiones se explica únicamente por el espacio compartido de uso? es decir, la forma de probar si las asociaciones son aleatorios o preferido?

Si la respuesta a la primera pregunta será que las asociaciones entre individuos NO aleatoria, entonces tengo un segundo qeustion...

¿La estructura social se correlaciona con la relación genética? es decir, están estrechamente relacionados con los individuos más a menudo juntos? (Los perfiles de ADN de todos a particulares son bolow)

Aquí he creado algunos datos estructuralmente similar a la de mi base de datos:

data <- data.frame(obs_date = c("C1","C2","C3","C4","C5","C6","C1","C2",
                                "C3","C4","C1","C2","C3","C1","C2","C3",
                                "C4","C5","C6","C7","C1","C3","C4","C5",
                                "C6","C7","C8","C3","C4","C5","C6","C7",
                                "C3","C4","C5","C6","C3","C4","C5","C3",
                                "C4","C5","C6","C5","C6","C7","C8","C5",
                                "C5","C6","C7","C8","C5","C6","C7","C7",
                                "C7","C8","C7","C8","C7","C8","C7","C8"),
                   ind_id = rep(LETTERS[1:20], times = c(6,4,3,7,1,6,5,4,
                                               3,2,2,4,1,4,3,1,2,2,2,2)),
                   obs = rep(c("seen","not_seen","seen","not_seen","seen",
                               "not_seen","seen","not_seen","seen"),
                               times = c(3,1,4,1,9,1,9,3,33)))

Aquí he añadido la estructura genética. Los datos son completamente inventadas, sino que debe reflejar la estrecha relación genética entre las mismas collor de los individuos. Adicionalmente , "violeta" las personas son descendientes de "azul", "azul" son descendientes de "verde", "verde" son descendientes de la "roja".

gen.raw <- matrix(c("a","g","g","g","c","g","a","a","g","g","g","g","t","c","t","c","t","t","a","a","t","t","a","a",
                    "a","g","g","g","c","g","a","a","g","g","g","g","c","c","t","c","t","t","a","a","t","c","a","a",
                    "a","g","g","g","c","g","g","a","g","g","g","g","c","c","t","t","c","t","a","a","t","c","a","a",
                    "a","g","t","t","t","g","g","a","g","g","g","g","c","c","t","t","c","t","a","a","a","c","a","a",
                    "a","g","t","t","t","g","g","a","g","g","g","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","g","a","g","g","g","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","g","g","g","g","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","a","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","t","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","t","c","a","a",
                    "a","g","t","t","t","g","a","c","g","t","c","g","c","c","t","t","c","t","t","a","t","c","a","a",
                    "a","g","t","c","t","g","a","c","g","g","c","g","c","c","t","t","c","t","t","a","t","c","a","a",
                    "a","g","t","c","t","g","a","c","g","g","c","g","c","c","t","t","c","t","t","a","t","c","a","a",
                    "a","g","t","c","t","g","a","c","g","g","c","g","c","c","t","t","c","t","t","a","t","c","a","a",
                    "a","g","t","c","t","g","a","c","g","c","c","g","t","c","t","t","c","t","t","a","t","c","a","a"),
                    byrow = TRUE, ncol = 24)
rownames(gen.raw) <- LETTERS[1:20]

Ok, las fuentes de datos están dados anteriormente. Ahora voy a crear dos matrices de distancia. La primera es la asociación de la matriz derivada de la co-ocurrencia de los datos representados por O-índice SP. Observó Gallinero-Compartir Proporción se calcula para cada par de individuos por dividir el número de días en que dos personas se encuentran juntos por el número de todas las posibles días de poder estar juntos (solapamiento entre la primera y la última recordngs tanto de los individuos).

# matrix of days roosting together
EG <- expand.grid(unique(data$ind_id), unique(data$ind_id))

data_seen <- subset(data, obs == "seen")

my.length.dt <- numeric(nrow(EG))
for (i in 1:nrow(EG)) {
my.length.dt[i] <- length(intersect(as.vector(data_seen$obs_date[data_seen$ind_id == EG[i, 1]]),
                                    as.vector(data_seen$obs_date[data_seen$ind_id == EG[i, 2]])))
days.together <- matrix(my.length.dt, byrow = TRUE, ncol = length(unique(data$ind_id)))
    colnames(days.together) <- rownames(days.together) <- unique(data$ind_id)
}
days.together

# matrix of all possible potentional roosting days
EG <- expand.grid(unique(data$ind_id), unique(data$ind_id))
my.length.rdp <- numeric(nrow(EG))
for (i in 1:nrow(EG)) {
my.length.rdp[i] <- length(intersect(as.vector(data$obs_date[data$ind_id == EG[i, 1]]),
                                     as.vector(data$obs_date[data$ind_id == EG[i, 2]])))
roosting_days_possible <- matrix(my.length.rdp, byrow = TRUE, ncol = length(unique(data$ind_id)))
    colnames(roosting_days_possible) <- rownames(roosting_days_possible) <- unique(data$ind_id)
}
roosting_days_possible

# OBSERVED ROOST-SHARING PROPORTION
OSP <- days.together/roosting_days_possible
OSP[ is.nan(OSP) ] <- 0
diag(OSP) <- 0

# So here is association matrix derived from co-occurence data
round(OSP,2)
# social distance matrix
soc_dist <- as.dist(OSP)

El próximo paso es tomar las secuencias de ADN y hacer que la relación genética de la matriz

# creating matrix of relatedness
library(ape)
gen.str <- as.DNAbin(gen.raw)
my.gen.dist <- dist.dna(gen.str)
fit <- hclust(my.gen.dist, method="ward")
plot(fit) # display dendogram 

Por último, aquí os comparar la distancia social con la distancia genética por la Repisa de la chimenea de la prueba.

library(ade4)
mantel.rtest(soc_dist, my.gen.dist, nrepet = 9999)

¿Su resultado (p > 0.05) significa que no hay correlación entre lo social y de la estructura genética?

Es esta la solución más adecuada para responder a mi pregunta? Alguna idea?

También he encontrado que para la estructura social podría ser mejor este tipo de gráfico en lugar de dendrograma. Buena para la búsqueda de distinto grupo social.

# Show social structure
library(igraph)
g <- graph.adjacency(OSP, weighted=TRUE, mode ="undirected")
g <- simplify(g)
# set labels and degrees of vertices
V(g)$label <- V(g)$name
V(g)$degree <- degree(g)
wc <- walktrap.community(g)
plot(wc, g)

3voto

ℳ  . Puntos 133

Creo que su pregunta podría ser menos de un método de pregunta y más de una pregunta teórica sobre lo que usted está tratando de lograr con sus datos.

Si usted está interesado en co-ocurrencias sólo, ¿ realmente importa que algunas personas tienen más tiempo que otros para formar lazos con el fin de encontrar subgrupos?

Ahora, se podría pensar en algunas maneras para corregir el hecho de que algunos individuos tienen más tiempo para "satisfacer" a los demás porque se capturaron más a menudo. Usted podría utilizar la fuerza de los lazos para reflejar esto. Usted podría, por ejemplo, dividir la fuerza de un empate por el número de la observación de windows de un individuo está presente en. La desventaja de esto es que la fuerza de la eliminatoria será diferente para los individuos en el mismo díada, esencialmente, haciendo de su red en un ponderado dirigida red donde todos los lazos son correspondidos. La desventaja de esto es que el algoritmo en la walktrap.community() función omite borde de la dirección. Esto significa que usted tendría que mirar para otro de la comunidad algoritmo de detección.

Otra manera de reducir el problema con las personas que tienen más o menos tiempo para "cumplir" sería crear varias instantáneas de su red en la que sólo se mantienen los vínculos que aparecen en los n periodos anteriores (usted necesitará su conocimiento específico de las especies estudiadas y los datos para determinar qué valor de n tiene sentido). Esto significa que los lazos de caries después de un tiempo y que va a reducir la tendencia de los individuos a los que se presentan más a menudo para ser el más central. La desventaja es que usted termina para arriba con varias redes que reflejan el estado de las relaciones en el tiempo diferentes y por lo tanto, usted no será capaz de obtener una comunidad estable la pertenencia de cada individuo. En su lugar, el funcionamiento de su comunidad algoritmo de detección en cada instantánea de la red a la que va a tener una mayor visión dinámica de cambio en los miembros de la comunidad a lo largo del tiempo.

Como he dicho al principio, creo que es una pregunta teórica, más que nada. Usted necesita preguntarse a sí mismo preguntas tales como: ¿por qué quiero para clasificar a los individuos en grupos? Lo que creo que significa ser miembros de un mismo grupo? Responder a estas preguntas le informará de cómo abordar el análisis de la red.

2voto

MrMeritology Puntos 1013

Ahora voy a crear dos matrices de distancia. La primera es la asociación de la matriz derivada de la co-ocurrencia de los datos representados por O-índice SP. Observó Gallinero-Compartir Proporción se calcula para cada par de individuos dividiendo el número de días en que dos personas se encuentran juntos por el número de todas las posibles días de poder estar juntos (solapamiento entre la primera y la última recordngs tanto de los individuos).

Con respecto a este paso, creo que sería mucho más éxito si usted utiliza el Agente de Modelado basado en (ABM). El enfoque que usted describe parece complicado para mí, y ABM código probable que sea mucho más simple, es decir, más fácil de implementar, probar, refinar y validar -- y también mucho más justificable desde una teórica y empírica punto de vista. El modelo que usted está tratando de crear es algo común en el campo de las Ciencias Sociales de cómputo, que incluye ABM como una de las principales de modelado/simulación método.

Le sugiero que use NetLogo (https://ccl.northwestern.edu/netlogo/). Cada uno de sus individuos serían agentes en NetLogo. Cada paso de tiempo, cada agente se ejecuta un programa que determina su interacción con el entorno, a otros agentes, y los cambios en su estado interno. (Si lo desea, también puede agregar depredador de los agentes, pero suena como a usted le gusta tratar a la tasa de mortalidad como una constante la probabilidad de cada paso de tiempo, o tal vez como una función de la edad y el tiempo.) Usted puede programar el agente de movimientos en 2D espacio físico ("parches"), y por lo tanto se puede simular el proceso de los agentes de la reunión de otros agentes y de la "percha" juntos. Pueden aparearse y tener sus bebés, demasiado, y transmitir su material genético, como el estado interno de los nuevos agentes. A lo largo del camino, los agentes de la forma social de la red de vínculos, por lo que cada vez las reglas de implementar. NetLogo se ha incorporado en las capacidades para gráficos dinámicos (es decir, redes sociales) entre los agentes, y también la visualización.

Después de su programa de simulación, sólo se ejecuta N veces aleatorias de las condiciones iniciales, donde N es el elegido para ser lo suficientemente grande como para darle la suficiente confianza estadística en el análisis final. Usted puede grabar los datos (es decir, su "observaciones") cada T pasos para simular los datos anuales. Usted sólo tendrá que utilizar R para el análisis estadístico al final de las pistas. Hay un NetLogo extensión para importar y exportar datos a R aquí: https://github.com/NetLogo/NetLogo/wiki/Extensions.


Usted podría tener reservas acerca de este enfoque, ya que implica el aprendizaje de un nuevo sistema y un nuevo lenguaje (NetLogo tiene su propio lenguaje de scripting). Sin embargo, es bastante fácil de aprender (muchos principiantes y los no-programadores aprender y usar con éxito). Pero el principal beneficio es que usted es el modelado de los fenómenos de interés en una forma muy directa y natural de manera que se simplifica enormemente la tarea y reduce en gran medida las posibilidades de error a lo largo del camino.


Puedo comparar la distancia social con la distancia genética por la Repisa de la chimenea de la prueba.

Con respecto a este paso, creo que es vital que primero establecer que el espacio de posibles social distancias es un espacio métrico y que tiene características que la hacen comparable a distancia genética dentro del espacio de posibles genomas. Sólo porque usted tiene tanto en la forma de la matriz es no suficiente, en mi punto de vista (aunque no tengo experiencia con esta prueba en particular). Por ejemplo, la distancia genética = cero significa genomas idénticos, ¿verdad? Pero ¿qué significa "distancia social = cero"? Si el cero no está definido por la distancia social, a continuación, se produce la definición de una métrica (ver: https://en.wikipedia.org/wiki/Metric_space#Definition).

Segundo, creo que usted debe medir el cambio en las distancias. Usted tiene ciertas condiciones iniciales, que involucran tanto social inicial y distancias inicial de distancias genéticas. Después de un cierto número de años, a pesar de que el apareamiento, la mortalidad y geográficas/de la mezcla social, su población tiene un conjunto final de las distancias sociales y las distancias genéticas. La ABM enfoque hace que esto sea más visible.


Sobre la Repisa de la chimenea de la prueba, en particular, también se puede evaluar Bayesiano alternativas. Desde la entrada de la Wikipedia: "...la Repisa de la chimenea y parcial de la Repisa de la chimenea de pruebas puede ser errónea en la presencia de ordenación del territorio de auto-correlación y volver erróneamente bajos valores de p Ver, por ejemplo, Guillot y Rousset, 2013 [3])" Un enfoque Bayesiano puede ser capaz de evitar este problema y también otros asociados con la Hipótesis Nula Pruebas de Significación (NHST). Sin embargo, no tengo una sugerencia específica en un enfoque Bayesiano para esta prueba.

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