踩坑日记[生信等][2025]

3.1k 词

[2025-02-24]seurat V5对象转adata对象

据说对于V4和之前的版本,SeuratDisk可以用,V5则要转回V3的assay。

还有另一个包SCP,里面的srt_to_adata()中,特征元信息用的变量名是meta.features,但根据这个issueAssay5对象的特征元信息变量名也改成了meta.data,需要改一下源码里的变量名。
还有另一个问题,目前这里面转出来的adata对象的write_loom()方法有些问题,特征名样本名都没了,但write_h5ad()方法可以用。

[2025-02-25]scenic用到的genome ranking database

这里面找就好了。

还有,先装个docker或者singularity再跑pySCENIC都比arboreto_with_multiprocessing.py要快。另外他们文档里singularity的部分写错了,按格式写就好。

[2025-02-28]reticulate查看已安装包信息

才发现也才意识到以前的不对劲,py_config()可能不会列出所有包,要用py_list_packages()

[2025-05-12]seurat 5.13SketchData()提示Error in LeverageScore():! too slow

按照issue/9857,加入features = VariableFeatures(object)参数即可。

[2025-05-13]spacexr创建referencerun.RCTD()提示每类至少25个细胞

又不想再重新生成一遍,直接改reference

1
2
3
4
5
6
7
8
9
10
11
type_count <- table(reference@cell_types)

filter_type <- type_count[type_count<25]

for (type in names(filter_type)) {
filter_barcode <- names(reference@cell_types)[reference@cell_types==type]

reference@cell_types <- reference@cell_types[!names(reference@cell_types) %in% filter_barcode]
reference@counts <- reference@counts[, !colnames(reference@counts) %in% filter_barcode]
reference@nUMI <- reference@nUMI[!names(reference@nUMI) %in% filter_barcode]
}

[2025-05-16]import spatialdata相关包时NotImplementedError: The legacy implementation is no longer supported

这是因为Dask的更新,根据issue/835,可以通过降级到2024.12.1版本解决。

[2025-05-17]在spatialdata object反卷积结果的子集中聚类

在SpatialData对象中反卷积结果的类别子集中聚类,此时可能会产生数百个簇,我的猜想是:

此时使用的是整个的近邻图,而由于反卷积是在单个bin上进行的,上可能不连续,这就造成难以成簇。

一个可行的做法是在中重新计算近邻图,我没有仔细研究如何在中直接计算的近邻图(应该可以在sc.pp.neighbors时使用anndata子集然后指定key_added,并在sc.tl.leiden时指定相应neighbors_key)。
所以使用了直接导出为新spatialdata对象的做法(如果使用seurat,在子集中重新计算近邻图或者导出子集更加方便)。

用GPT改的sd_subset()

这个dataset_id就是spatialdata_io.visium_hd()里的dataset_id

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def sd_subset(sdata_obj, subset_obs, subset_value_list, table_name='square_008um', shape_name='dataset_id_square_008um', link_key='location_id'):
"""
根据指定的 obs 列值筛选 SpatialData 对象的子集。

参数:
- sdata_obj: SpatialData 对象,包含表格、形状和图像数据
- subset_obs: str, AnnData.obs 中用于筛选的列名
- subset_value_list: list, subset_obs 列中要保留的值列表
- table_name: str, SpatialData 中 AnnData 表格的名称(默认: 'square_008um')
- shape_name: str, SpatialData 中形状数据的名称(默认: 'dataset_id_square_008um')
- link_key: str, AnnData.obs 中链接形状的列名(默认: 'location_id')

返回:
- sdata_subset: SpatialData 对象,包含筛选后的数据
"""
# 步骤 1: 获取 AnnData 表格
adata = sdata_obj.tables[table_name]

# 步骤 2: 根据 subset_obs 列筛选 AnnData
condition = adata.obs[subset_obs].isin(subset_value_list)
adata_subset = adata[condition].copy()

# 步骤 3: 获取筛选后 AnnData 中的 link_key 值
link_values = adata_subset.obs[link_key]

# 步骤 4: 根据 link_values 筛选对应的形状
shapes_subset = sdata_obj.shapes[shape_name].loc[link_values]

# 步骤 5: 创建新的 SpatialData 对象
sdata_subset = sd.SpatialData(
images=sdata_obj.images, # 保留原始图像
shapes={shape_name: shapes_subset}, # 筛选后的形状
tables={table_name: adata_subset}, # 筛选后的表格
coordinate_systems=sdata_obj.coordinate_systems # 保留原始坐标系统
)

return sdata_subset

导出之后,在其上重新计算近邻图再聚类就好了。