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.

Submuestreo aleatorio del objeto Seurat

He estado intentando submuestrear aleatoriamente mi objeto seurat.
Estoy interesado en submuestrear basado en 2 columnas: condición y tipo celular. Tengo 5 condiciones y 5 tipos celulares. El objetivo principal es tener 1000 células para cada tipo celular en cada condición.
He intentado lo siguiente hasta ahora:

Lo primero es subconjuntar mi objeto seurat:

my.list <- list(hipo.c1.neurons = hipo %>%
subset(., condition %in% “c1” & group %in% “Neurons”),
hipo.c1.oligo = hipo %>%
subset(., condition %in% “c1” & group %in% “Oligod”)…etc…)

Y luego submuestrear utilizando la función de muestra:

set.seed(0)
my.list.sampled <- lapply(X = my.list, FUN = function(x) {
x <- x[,sample(ncol(x), 1000, replace = FALSE)]
})

Y obtengo este error ya que hay algunos objetos con menos de 1000 células: error in evaluating the argument ‘j’ in selecting a method for function ‘[‘: cannot take a sample larger than the population when ‘replace = FALSE’

Entonces he intentado con esta función:

lapply_with_error <- function(X,FUN,…){
lapply(X, function(x, …) tryCatch(FUN(x, …),
error = function(e)NULL))
}

Pero luego me da 0 en aquellos objetos que tienen menos de 1000 células. ¿Cuál sería la forma de saltar aquellos objetos que tienen menos de 1000 células y dejarlos como están (no submuestrear esos)?
¿Hay alguna manera más sencilla de hacer esto, para que no tenga que subconjuntar todos mis objetos por separado?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener una submuestra de tu objeto seurat basado en dos columnas, puedes usar las funciones group_by y sample_n del paquete dplyr. Primero, agrupa tus células por condición y tipo de célula usando group_by, luego utiliza sample_n para muestrear aleatoriamente 1000 células de cada grupo. Aquí tienes un ejemplo de código:

    library(dplyr)
    
    submuestreado_seurat <- mi_objeto_seurat %>%
      group_by(condición, tipo_de_célula) %>%
      sample_n(size = 1000) %>%
      ungroup()
    

    Este código devolverá un nuevo objeto seurat con las mismas células, pero cada grupo de condición y tipo de célula tendrá exactamente 1000 células. Este enfoque evita el problema de intentar muestrear más células de las disponibles en un grupo.

Comments are closed.