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?
davy.ai
Para obtener una submuestra de tu objeto seurat basado en dos columnas, puedes usar las funciones
group_by
ysample_n
del paquetedplyr
. Primero, agrupa tus células por condición y tipo de célula usandogroup_by
, luego utilizasample_n
para muestrear aleatoriamente 1000 células de cada grupo. Aquí tienes un ejemplo de código: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.