scanpy合并多个adata数据集和根据条件进行随机抽取细胞

这篇博客介绍了如何使用scanpy库来处理单细胞RNA测序数据。首先,从DataFrame加载rna_counts数据并构建AnnData对象。接着,添加了数据集的分组信息。然后,演示了如何合并多个AnnData对象成一个大的数据集。最后,讨论了如何依据'batch'分组进行等比例和不等比的随机抽样操作,以便于后续分析。
import pandas as pd ; import numpy as np ; from scipy import sparse
import scanpy as sc
import anndata as ad
import os

加载datafram格式的rna_counts数据集构建AnnData

X = pd.read_csv(r'./1.rnacounts.tsv', sep = '\t').transpose()
X = sparse.csr_matrix(X)
ad_1 = ad.AnnData(X = X.values, obs = pd.DataFrame(index = X.index), var = pd.DataFrame(index = X.columns))
ad_1.var_names_make_unique()
ad_1.obs_names_make_unique()
X = pd.read_csv(r'./2.rnacounts.tsv', sep = '\t').transpose()
X = sparse.csr_matrix(X)
ad_2 = ad.AnnData(X = X.values, obs = pd.DataFrame(index = X.index), var = pd.DataFrame(index = X.columns))
ad_2.var_names_make_unique()
ad_2.obs_names_make_unique()
X = pd.read_csv(r'./3.rnacounts.tsv', sep = '\t').transpose()
X = sparse.csr_matrix(X)
ad_3 = ad.AnnData(X = X.values, obs = pd.DataFrame(index = X.index), var = pd.DataFrame(index = X.columns))
ad_3.var_names_make_unique()
ad_3.obs_names_make_unique()

添加数据集的分组信息

ad_1.obs["batch"] = "batch_1"
ad_2.obs["batch"] = "batch_2"
ad_3.obs["batch"] = "batch_3"
print("ad_1:::",ad_1.shape,"\nad_2:::",ad_2.shape,"\nad_3:::",ad_3.shape)

合并多个AnnData对象为一个数据集

adList= [ad_1,ad_2,ad_3]
#ad_all =ad.concat(adList,join='outer') #合并同R语言Seurat的merge(scRNAList[[1]],scRNAList[2:length(scRNAList)])
ad_all = sc.AnnData.concatenate(*scRNAList,join='outer')
ad_all.var_names_make_unique()
ad_all.obs_names_make_unique()
sc.pp.calculate_qc_metrics(ad_all, percent_top=None,log1p=False,inplace=True) #counts统计

根据batch分组进行等比例抽取数据

N = 1000 #每组抽1000细胞
ad_tmp = ad_all[ad_all.obs.groupby("batch").sample(n = N, random_state=123,replace=False).index].copy
frac = 0.5 #每组抽50%的细胞
ad_tmp = ad_all[ad_all.obs.groupby("batch").sample(frac = frac, random_state=123,replace=False).index].copy

根据batch列的信息进行分层不等比采样

adList=[]
groups = ad_all.obs.groupby("batch").size()
for batch in group.index:
    i = groups [batch]
    frc = i / ad_all.obs.groupby("batch").size().sum()
    N = int(round(frc*1000,0)) #总采取1000细胞,分层不等比抽取
    _index = ad_all.obs[ ad_all.obs["batch"] == batch ].sample(n = N, random_state=123,replace=False).index
    ad_tmp = ad_all[_index].copy()
    adList.append(ad_tmp)
#ad_sub =ad.concat(adList,join='outer')
ad_sub = sc.AnnData.concatenate(*adList,join='outer')
<think>好的,我现在需要帮助用户解决使用Scanpy进行自动细胞注释的问题。用户之前已经询问过手动注释的代码,现在他们可能希望了解如何自动化这一过程,以提高效率或处理更大的数据集。首先,我需要回忆Scanpy中自动注释的方法。通常,自动注释会使用参考数据集,比如使用细胞类型标记数据库或已注释的数据集。常见的工具包括scanpy的sc.tl.score_genes与参考数据集的整合方法,比如sc.tl.ingest或者使用ScArches进行映射。用户可能需要具体的代码示例,所以我要确保代码步骤清晰,包括数据加载、预处理、参考数据集整合、自动注释以及结果可视化。同时,需要解释每个步骤的作用,比如使用sc.tl.ingest将查询数据映射到参考数据集上。另外,用户可能对如何获取参考数据集有疑问,所以应该提到使用例如cellxgene提供的数据集,比如Pancreas数据集。还需要注意版本兼容性依赖安装,比如需要scikit-miscscarches等包。 可能遇到的问题包括数据预处理的一致性,比如是否需要进行相同的归一化高变基因选择。此外,自动注释的准确性可能依赖于参考数据集的质量相关性,需要提醒用户注意选择合适的参考数据。 最后,相关问题部分需要考虑用户可能进一步的问题,比如如何处理注释中的不确定性,整合多个参考数据集的方法,与其他自动注释工具的比较,以及处理大型数据时的性能优化。这些问题有助于用户深入理解自动注释的不同方面潜在挑战。</think>以下是在手动注释基础上增加自动注释流程的Python代码,使用Scanpy结合参考数据集进行自动细胞类型注释: ```python import scanpy as sc import scvi import numpy as np from scarches.dataset.trvae.data_handling import remove_sparsity from sklearn.preprocessing import LabelEncoder # 1. 加载查询数据集(待注释数据) query_adata = sc.read_10x_mtx( 'query_data/', var_names='gene_symbols', cache=True ) # 基本预处理 sc.pp.filter_cells(query_adata, min_genes=200) sc.pp.filter_genes(query_adata, min_cells=3) sc.pp.normalize_total(query_adata) sc.pp.log1p(query_adata) sc.pp.highly_variable_genes(query_adata, n_top_genes=2000) query_adata = query_adata[:, query_adata.var.highly_variable] # 2. 加载参考数据集(已注释的公共数据集) # 示例使用Pancreas数据集(需提前下载) ref_adata = sc.datasets.pancreas() ref_adata.obs['cell_type'] = ref_adata.obs['cell type'] # 统一列名 # 确保基因符号一致 common_genes = query_adata.var_names.intersection(ref_adata.var_names) query_adata = query_adata[:, common_genes] ref_adata = ref_adata[:, common_genes] # 3. 使用scArches进行映射训练 # 数据准备 remove_sparsity(ref_adata) remove_sparsity(query_adata) # 编码细胞类型标签 le = LabelEncoder() ref_adata.obs['cell_type_encoded'] = le.fit_transform(ref_adata.obs['cell_type']) # 训练参考模型 scvi.model.SCVI.setup_anndata(ref_adata) vae = scvi.model.SCVI(ref_adata, n_layers=2, n_latent=30) vae.train(max_epochs=100) # 保存参考模型 vae.save('pancreas_scvi_model') # 4. 将查询数据映射到参考空间 query_vae = scvi.model.SCVI.load_query_data( query_adata, 'pancreas_scvi_model/', freeze_expression=True ) query_vae.train(max_epochs=50) # 获取潜在表示 ref_latent = vae.get_latent_representation() query_latent = query_vae.get_latent_representation() # 5. KNN分类器进行预测 from sklearn.neighbors import KNeighborsClassifier # 训练分类器 knn = KNeighborsClassifier(n_neighbors=10) knn.fit(ref_latent, ref_adata.obs['cell_type']) # 预测查询数据 query_adata.obs['predicted_cell_type'] = knn.predict(query_latent) # 6. 结果可视化与验证 # UMAP降维 sc.pp.neighbors(query_adata, use_rep='X_scVI') sc.tl.umap(query_adata) # 绘制预测结果 sc.pl.umap( query_adata, color=['predicted_cell_type'], frameon=False, legend_loc='on data', title='Auto-annotated Cell Types' ) # 7. 保存结果 query_adata.write('annotated_data.h5ad') ``` 代码解释: 1. **双数据预处理**:对查询数据参考数据集进行基因对齐标准化处理 2. **参考模型训练**:使用scVI在参考数据上训练变分自编码器 3. **映射与预测**:通过迁移学习将查询数据映射到参考空间,使用KNN分类器预测细胞类型 4. **结果验证**:通过UMAP可视化预测结果的空间分布 关键改进: - 使用scVI进行深度特征提取 - 通过迁移学习实现高效映射 - KNN分类器结合参考数据标签进行预测 - 支持细胞类型概率预测(可通过`knn.predict_proba()`获取) 安装依赖: ```bash pip install scanpy scvi scikit-learn scarches cellxgene ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪桦

有帮助的话请杯咖啡吧,谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值