R 中,geo 数据集 分析探针转基因的时候,一个探针对应的多个基因的情况

解决函数冲突问题

您遇到的错误是由于函数名冲突造成的。在 R 中,当多个包有相同名称的函数时,可能会发生这种情况。让我们修复这个问题:

安装必要的包

if (!require(“tidyverse”, quietly = TRUE))
install.packages(“tidyverse”)

library(tidyverse)

定义处理多基因注释的函数(使用显式命名空间)

probe_to_gene_multiple <- function(expr_matrix, annot_table) {

提取探针ID和基因符号

probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)

清洗基因符号(去除空值和无效值)

probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲ …GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]

只保留表达矩阵中存在的探针

common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<probe2gene[probe2geneProbeID %in% common_probes, ]

拆分多基因注释

probe2gene_split <- probe2gene %>%
dplyr::mutate(GeneSymbol = stringr::str_split(as.character(GeneSymbol), " /// ")) %>%
tidyr::unnest(GeneSymbol)

将表达矩阵转换为数据框

expr_df <- as.data.frame(expr_matrix) %>%
tibble::rownames_to_column(“ProbeID”)

合并表达矩阵和基因符号

merged_df <- expr_df %>%
dplyr::inner_join(probe2gene_split, by = “ProbeID”)

聚合表达值

agg_expr <- merged_df %>%
dplyr::select(-ProbeID) %>%
dplyr::group_by(GeneSymbol) %>%
dplyr::summarise(dplyr::across(dplyr::everything(), mean)) %>%
as.data.frame()

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneSymbolaggexprGeneSymbol agg_exprGeneSymbolaggexprGeneSymbol <- NULL

return(as.matrix(agg_expr))
}

尝试转换

expr_32967_gene <- probe_to_gene_multiple(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_multiple(expr_104786, annot_table)

替代方案:避免使用 tidyverse

如果问题仍然存在,我们可以使用基础 R 函数实现相同的功能:

使用基础 R 函数实现

probe_to_gene_multiple_base <- function(expr_matrix, annot_table) {

提取探针ID和基因符号

probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)

清洗基因符号(去除空值和无效值)

probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲ …GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]

只保留表达矩阵中存在的探针

common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<probe2gene[probe2geneProbeID %in% common_probes, ]

拆分多基因注释

split_genes <- strsplit(as.character(probe2gene$GeneSymbol), " /// ")

创建新的映射表

probe2gene_split <- data.frame(
ProbeID = rep(probe2gene$ProbeID, sapply(split_genes, length)),
GeneSymbol = unlist(split_genes),
stringsAsFactors = FALSE
)

将表达矩阵转换为数据框

expr_df <- as.data.frame(expr_matrix)
expr_df$ProbeID <- rownames(expr_df)

合并表达矩阵和基因符号

merged_df <- merge(expr_df, probe2gene_split, by = “ProbeID”)

聚合表达值

agg_expr <- aggregate(
merged_df[, setdiff(colnames(merged_df), c(“ProbeID”, “GeneSymbol”))],
by = list(GeneSymbol = merged_df$GeneSymbol),
FUN = mean
)

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneSymbolaggexprGeneSymbol agg_exprGeneSymbolaggexprGeneSymbol <- NULL

return(as.matrix(agg_expr))
}

尝试转换

expr_32967_gene <- probe_to_gene_multiple_base(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_multiple_base(expr_104786, annot_table)

如果仍然遇到问题:简化方法

如果上述方法仍然有问题,我们可以使用更简单的方法:

简化方法:只保留第一个基因符号

probe_to_gene_simple <- function(expr_matrix, annot_table) {

提取探针ID和基因符号

probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)

清洗基因符号(去除空值和无效值)

probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲ …GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]

只保留表达矩阵中存在的探针

common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<probe2gene[probe2geneProbeID %in% common_probes, ]

只保留第一个基因符号

probe2geneGeneSymbol<−sapply(strsplit(as.character(probe2geneGeneSymbol <- sapply(strsplit(as.character(probe2geneGeneSymbol<sapply(strsplit(as.character(probe2geneGeneSymbol), " /// "),
function(x) x[1])

处理多个探针对应同一基因的情况

expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE] agg_expr <- aggregate( expr_subset, by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL

return(agg_expr)
}

尝试转换

expr_32967_gene <- probe_to_gene_simple(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_simple(expr_104786, annot_table)

调试建议

如果问题仍然存在,请尝试以下调试步骤:

1. 检查数据

cat(“expr_32967 维度:”, dim(expr_32967), “\n”)
cat(“expr_104786 维度:”, dim(expr_104786), “\n”)
cat(“annot_table 维度:”, dim(annot_table), “\n”)

2. 检查特定探针

check_probe <- function(probe_id) {
cat(“探针”, probe_id, “在 expr_32967 中存在:”, probe_id %in% rownames(expr_32967), “\n”)
cat(“探针”, probe_id, “在 expr_104786 中存在:”, probe_id %in% rownames(expr_104786), “\n”)
cat(“探针”, probe_id, “在 annot_table 中存在:”, probe_id %in% annot_table$ID, “\n”)

if (probe_id %in% annot_tableKaTeX parse error: Expected '}', got 'EOF' at end of input: … <- annot_tableGene Symbol[annot_table$ID == probe_id]
cat(“基因符号:”, gene_symbol, “\n”)
}
}

检查您提到的探针

check_probe(“2315554”)
check_probe(“1007_s_at”)

3. 简化转换过程

simple_conversion <- function(expr_matrix, annot_table) {

创建映射表

probe2gene <- data.frame(
ProbeID = rownames(expr_matrix),
GeneSymbol = NA,
stringsAsFactors = FALSE
)

添加基因符号

for (i in 1:nrow(probe2gene)) {
probe_id <- probe2geneProbeID[i]if(probeidProbeID[i] if (probe_id %in% annot_tableProbeID[i]if(probeidID) {
gene_symbol <- annot_table‘GeneSymbol‘[annottable`Gene Symbol`[annot_tableGeneSymbol[annottableID == probe_id]
# 只取第一个基因符号
if (length(gene_symbol) > 0) {
gene_symbol <- strsplit(as.character(gene_symbol), " /// ")[[1]][1]
probe2gene$GeneSymbol[i] <- gene_symbol
}
}
}

移除没有基因符号的探针

probe2gene <- probe2gene[!is.na(probe2gene$GeneSymbol), ]

聚合表达值

expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE] agg_expr <- aggregate( expr_subset, by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL

return(agg_expr)
}

尝试转换

expr_32967_gene <- simple_conversion(expr_32967, annot_table)
expr_104786_gene <- simple_conversion(expr_104786, annot_table)

最终解决方案

如果所有方法都失败,我们可以直接使用探针ID进行分析:

1. 找到共同探针

common_probes <- intersect(rownames(expr_32967), rownames(expr_104786))

2. 合并表达矩阵

combined_expr <- cbind(
expr_32967[common_probes, ],
expr_104786[common_probes, ]
)

3. 定义批次变量

batch <- c(
rep(“GSE32967”, ncol(expr_32967)),
rep(“GSE104786”, ncol(expr_104786))
)

4. ComBat批次校正

library(sva)
corrected_expr <- ComBat(
dat = combined_expr,
batch = batch,
par.prior = TRUE
)

5. 创建整合数据集

integrated_data <- list(
expr = corrected_expr,
phenoData = rbind(pheno_32967, pheno_104786),
featureData = data.frame(
probe = common_probes,
row.names = common_probes
),
batch_info = batch
)

6. 保存整合数据集

saveRDS(integrated_data, “Integrated_Prostate_Cancer_Dataset_Probes.rds”)

这样您至少可以完成数据整合和批次校正,基因注释可以在后续分析中添加。

方法2:只保留第一个基因符号
probe_to_gene_first <- function(expr_matrix, annot_table) {

提取探针ID和基因符号

probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)

清洗基因符号(去除空值和无效值)

probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲ …GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]

只保留表达矩阵中存在的探针

common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<probe2gene[probe2geneProbeID %in% common_probes, ]

只保留第一个基因符号

probe2geneGeneSymbol<−sapply(strsplit(as.character(probe2geneGeneSymbol <- sapply(strsplit(as.character(probe2geneGeneSymbol<sapply(strsplit(as.character(probe2geneGeneSymbol), " /// "),
function(x) x[1])

处理多个探针对应同一基因的情况

expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE] agg_expr <- aggregate( expr_subset, by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL

return(agg_expr)
}
方法3:使用自定义规则处理复杂注释
probe_to_gene_custom <- function(expr_matrix, annot_table) {

提取探针ID和基因符号

probe2gene <- annot_table[, c(“ID”, “Gene Symbol”)]
colnames(probe2gene) <- c(“ProbeID”, “GeneSymbol”)

清洗基因符号(去除空值和无效值)

probe2gene <- probe2gene[!is.na(probe2geneKaTeX parse error: Expected 'EOF', got '&' at position 13: GeneSymbol) &̲ …GeneSymbol != “” &
probe2gene$GeneSymbol != “—”, ]

只保留表达矩阵中存在的探针

common_probes <- intersect(probe2geneProbeID,rownames(exprmatrix))probe2gene<−probe2gene[probe2geneProbeID, rownames(expr_matrix)) probe2gene <- probe2gene[probe2geneProbeID,rownames(exprmatrix))probe2gene<probe2gene[probe2geneProbeID %in% common_probes, ]

处理多基因注释

probe2geneGeneSymbol<−sapply(probe2geneGeneSymbol <- sapply(probe2geneGeneSymbol<sapply(probe2geneGeneSymbol, function(gene_str) {
# 如果包含"///“,则进行处理
if (grepl(” /// ", gene_str)) {
genes <- unlist(strsplit(gene_str, " /// "))

  # 规则1: 优先选择没有连字符的基因
  no_hyphen <- genes[!grepl("-", genes)]
  if (length(no_hyphen) > 0) return(no_hyphen[1])
  
  # 规则2: 选择最长的基因名
  return(genes[which.max(nchar(genes))])
}
return(gene_str)

})

处理多个探针对应同一基因的情况

expr_subset <- expr_matrix[probe2geneProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probe2geneProbeID, , drop = FALSE] agg_expr <- aggregate( expr_subset, by = list(Gene = probe2geneProbeID,,drop=FALSE]aggexpr<aggregate(exprsubset,by=list(Gene=probe2geneGeneSymbol),
FUN = mean
)

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL

return(agg_expr)
}
处理特定探针的注释
对于您提到的特定探针,我们可以手动处理:

手动处理特定探针的注释

handle_specific_probes <- function(expr_matrix) {

创建探针到基因的映射表

probe_map <- data.frame(
ProbeID = rownames(expr_matrix),
GeneSymbol = NA,
stringsAsFactors = FALSE
)

手动添加已知探针的映射

known_mappings <- list(
“2315554” = “SLC25A20”, # GSE104786中的探针
“1007_s_at” = “DISC1” # GSE32967中的探针
)

应用已知映射

for (probe_id in names(known_mappings)) {
if (probe_id %in% probe_mapKaTeX parse error: Expected '}', got 'EOF' at end of input: … probe_mapGeneSymbol[probe_map$ProbeID == probe_id] <- known_mappings[[probe_id]]
}
}

处理多基因注释

for (i in 1:nrow(probe_map)) {
if (is.na(probe_mapKaTeX parse error: Expected '}', got 'EOF' at end of input: … <- annot_tableGene Symbol[annot_tableID==probemapID == probe_mapID==probemapProbeID[i]]
if (length(gene_str) > 0 && grepl(" /// ", gene_str)) {
genes <- unlist(strsplit(gene_str, " /// "))
# 使用自定义规则选择基因
probe_map$GeneSymbol[i] <- genes[1] # 或者使用其他规则
}
}
}

移除没有基因符号的探针

probe_map <- probe_map[!is.na(probe_map$GeneSymbol), ]

处理多个探针对应同一基因的情况

expr_subset <- expr_matrix[probe_mapProbeID,,drop=FALSE]aggexpr<−aggregate(exprsubset,by=list(Gene=probemapProbeID, , drop = FALSE] agg_expr <- aggregate( expr_subset, by = list(Gene = probe_mapProbeID,,drop=FALSE]aggexpr<aggregate(exprsubset,by=list(Gene=probemapGeneSymbol),
FUN = mean
)

设置行名为基因符号

rownames(agg_expr) <- agg_exprGeneaggexprGene agg_exprGeneaggexprGene <- NULL

return(agg_expr)
}
完整的工作流程

1. 获取平台注释

gpl570 <- getGEO(“GPL570”, AnnotGPL = TRUE)
annot_table <- Table(gpl570)

2. 转换探针为基因符号(使用方法1)

expr_32967_gene <- probe_to_gene_multiple(expr_32967, annot_table)
expr_104786_gene <- probe_to_gene_multiple(expr_104786, annot_table)

3. 找到共同基因

common_genes <- intersect(rownames(expr_32967_gene), rownames(expr_104786_gene))

4. 合并表达矩阵

combined_expr <- cbind(
expr_32967_gene[common_genes, ],
expr_104786_gene[common_genes, ]
)

5. 定义批次变量

batch <- c(
rep(“GSE32967”, ncol(expr_32967_gene)),
rep(“GSE104786”, ncol(expr_104786_gene))
)

6. ComBat批次校正

library(sva)
corrected_expr <- ComBat(
dat = combined_expr,
batch = batch,
par.prior = TRUE
)

7. 创建整合数据集

integrated_data <- list(
expr = corrected_expr,
phenoData = rbind(pheno_32967, pheno_104786),
featureData = data.frame(
gene = common_genes,
row.names = common_genes
),
batch_info = batch
)

8. 保存整合数据集

saveRDS(integrated_data, “Integrated_Prostate_Cancer_Dataset.rds”)

9. 验证批次校正效果

pca_res <- prcomp(t(corrected_expr), scale. = TRUE)
plot(pca_resx[,1:2],col=as.factor(batch),pch=16,main="批次校正后PCA",xlab=paste0("PC1(",round(summary(pcares)x[, 1:2], col = as.factor(batch), pch = 16, main = "批次校正后PCA", xlab = paste0("PC1 (", round(summary(pca_res)x[,1:2],col=as.factor(batch),pch=16,main="批次校正后PCA",xlab=paste0("PC1(",round(summary(pcares)importance[2,1]*100, 1), “%)”),
ylab = paste0(“PC2 (”, round(summary(pca_res)$importance[2,2]*100, 1), “%)”))
legend(“topright”,
legend = unique(batch),
col = 1:length(unique(batch)),
pch = 16)
处理多基因注释的最佳实践
​​优先使用方法1(拆分多基因注释)​​:

保留所有可能的基因注释

更全面地反映生物学信息

但可能导致基因数量增加

​​考虑后续分析需求​​:

如果进行差异表达分析,拆分多基因注释可能更合适

如果进行通路分析,可能需要更精确的基因注释

​​注释质量检查​​:

检查特定探针的注释

check_probe_annotation <- function(probe_id) {
annotation <- annot_table[annot_table$ID == probe_id, “Gene Symbol”]
cat(“探针”, probe_id, “的注释:”, annotation, “\n”)
}

check_probe_annotation(“2315554”)
check_probe_annotation(“1007_s_at”)
​​使用最新注释​​:

GEO平台注释可能过时

考虑使用最新数据库(如NCBI或Ensembl)进行重新注释

通过以上方法,您应该能够正确处理包含多基因注释的探针,并成功完成数据整合和批次校正。

### 将 GEO 探针 ID 转换为基因 Symbol 的方法 在处理 `GEO` 数据库中的基因表达数据时,探针 ID 需要转换为更易读的基因符号(Symbol),以便于进分析和解释。以下是实现这目标的具体方式: #### 使用 Bioconductor 中的注释包 Bioconductor 是一个专门用于生物信息学数据分析的强大工具集。通过安装并加载相应的注释包,可以轻松完成探针 ID 到基因 Symbol 的映射。 1. **安装注释包** 如果尚未安装所需的注释包,则可以通过以下命令进行安装: ```r if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install("hugene10sttranscriptcluster.db") # 替换为目标 GPL 平台对应的注释包名 ``` 2. **加载注释包** 安装完成后,加载该注释包以访问其中的数据表: ```r library(hugene10sttranscriptcluster.db) ``` 3. **提取探针基因的映射关系** 使用 `toTable()` 函数可以从注释包中提取探针 ID 和其对应基因符号的关系表: ```r ids <- toTable(hugene10sttranscriptclusterSYMBOL) # 获取探针ID与基因Symbol的映射 head(ids) # 查看前几行数据确认结果 ``` 4. **应用映射至表达矩阵** 假设已经从 GEO 下载了数据,并提取出了表达矩阵 `expr`,则可通过匹配探针对应基因符号来更新矩阵的行名: ```r rownames(expr) <- sapply(rownames(expr), function(x) { id_mapping <- ids[ids$PROBE_ID == x, "GENE_SYMBOL"] if (length(id_mapping)) return(id_mapping) else return(x) }) ``` #### 处理具体案例 如果需要处理的是某个具体的 GSE 数据集,例如 `GSE12417`,可按照以下流程操作: 1. **下载 GEO 数据** 使用 `getGEO()` 函数从 NCBI 下载所需数据集: ```r gset <- getGEO('GSE12417', destdir=".", getGPL = FALSE)[^4] e2 <- gset[[2]] # 根据实际需求选择合适的对象 expr <- exprs(e2) # 提取表达矩阵 ``` 2. **识别所使用的 GPL 平台** 检查数据集中使用的芯片平台(GPL)编号,从而确定需下载哪个注释包: ```r platform <- pData(e2)$platform_id cat("The used platform is:", unique(platform), "\n") ``` 3. **执行探针基因的转换** 结合上述步骤,利用相应注释包完成最终的转换过程。 --- ### 注意事项 - 不同的 GPL 平台可能对应不同的注释包名称,请根据实际情况调整。 - 若某些探针无法找到对应基因符号,可能是由于未注释或多重映射等原因造成[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值