es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Examinando posición de intersección y eliminando condicionalmente filas basadas en los valores de P.

Estoy trabajando en el análisis posterior de GWAS, donde he definido una lista de SNPs independientes asociados con mi rasgo. Estoy tratando de agrupar mis SNPs independientes en loci de +- 500KB. Hay algunos SNPs independientes cuyos loci se superponen y estoy tratando de escribir un código que descarte el SNP con el valor de p más alto si los dos loci se superponen.

Después de agregar dos columnas con la posición +- 500KB, se hace evidente que la fila 3 y 4 tienen posiciones genómicas superpuestas.

Lo que estoy tratando de hacer a partir de aquí es trabajar en un código condicional que mantendrá el SNP con el valor de p más bajo (en este ejemplo, rs3) y luego descartará la cuarta fila que contiene rs4.

Así que obtendré el siguiente resultado:

SNP bp p inicio fin
1: rs1 8537289 1.33785e-08 8037289 9037289
2: rs2 12263919 5.03939e-11 11763919 12763919
3: rs3 19771438 1.83669e-20 19271438 20271438

Soy consciente de que el agrupamiento de PLINK es el procedimiento habitual para definir loci, pero estoy intentando esto como una forma alternativa y robusta de establecer asociaciones con el rasgo. Espero que alguien esté dispuesto a compartir un poco de su brillante habilidad y prometo la mejor de las buenas karmas a cambio. Saludos.

EDIT:

Al revisar los resultados, noté un error involuntario producido con la gran solución proporcionada por @Axeman. Mis disculpas si no me expresé correctamente. Ejecuté el siguiente código para imprimir la “columna g” sin descartar SNPs:

d1 <- d %>% group_by(Chr,p, locus = cumsum(minus > lag(plus, default=1))) %>% slice_min(p)

Y observé que cuando el cromosoma cambia de n a n2, la región genómica no superpuesta se fusiona en un solo locus. Por lo tanto, el último locus en el cromosoma n y el primer locus en n2 se “fusionan” (o se descartan). ¿Sabrías cómo resolverlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para eliminar el SNP con el valor de P más alto cuando dos loci se superponen, puedes usar declaraciones condicionales en R. Aquí tienes un ejemplo de código:

    # definir una función para comparar los valores de P y eliminar el mayor
    drop_higher_p <- function(df) {
      if (nrow(df) == 1) {
        return(df) # si solo hay un SNP, devolverlo
      } else if (df$p[1] < df$p[2]) {
        return(df[1,]) # si el SNP 1 tiene un valor de P más bajo, mantenerlo
      } else {
        return(df[2,]) # si el SNP 2 tiene un valor de P más bajo o igual, eliminarlo
      }
    }
    
    # aplicar la función a cada locus
    result <- d %>%
      group_by(locus) %>%
      do(drop_higher_p(.))
    
    # ver el resultado final
    result
    

    Este código agrupa los SNP por locus y aplica la función drop_higher_p a cada locus. La función compara los valores de P de los dos SNP en el locus y elimina el que tenga el valor más alto. Las funciones group_by y do del paquete dplyr te permiten aplicar fácilmente la función a cada grupo de SNP.

    Nota: Este código asume que los SNP dentro de un locus están ordenados en orden ascendente de posición genómica. Si no es así, es posible que necesites ordenar los SNP dentro de cada locus por posición antes de aplicar la función.

Comments are closed.