ChAMP甲基化数据分析:从β值矩阵开始

本文介绍了如何利用R包ChAMP处理和分析从GEO获取的β矩阵文件进行甲基化数据研究。首先,通过GEOquery获取数据,然后进行缺失值处理,接着使用ChAMP进行过滤和预处理,包括SNP过滤、多位置匹配过滤等。虽然缺少某些信息,如detP和beadcount,但仍然能进行后续的标准化和SVD分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的推文详细介绍了ChMAP包从IDAT文件开始的甲基化数据分析流程,今天说一下从β矩阵开始的分析流程。

16.ChAMP分析甲基化数据:标准流程

数据准备

还是用GSE149282这个数据。

suppressMessages(library(GEOquery))

首先获取GSE149282这个数据的β矩阵文件,可以通过getGEO()函数下载,但是由于网络原因经常下载失败,所以我直接去GEO官网下载了这个数据,放到指定文件夹下读取即可。

GSE149282 <- getGEO("GSE149282",destdir = './gse149282',
                   getGPL = F, AnnotGPL = F
                   )
## Found 1 file(s)
## GSE149282_series_matrix.txt.gz
## Using locally cached version: ./gse149282/GSE149282_series_matrix.txt.gz
# 其实你用read.delim()也能读取成功

现在这个GSE149282是一个ExpressionSet对象,在刚学的时候,我不能理解R语言里面的很多对象,但是这并不影响一些操作,只要记住即可,学习不断深入,后面对R语言的各种对象的理解,会逐步明朗。

GSE149282
## $GSE149282_series_matrix.txt.gz
## ExpressionSet (storageMode: lockedEnvironment)
## assayData: 865918 features, 24 samples 
##   element names: exprs 
## protocolData: none
## phenoData
##   sampleNames: GSM4495491 GSM4495492 ... GSM4495514 (24 total)
##   varLabels: title geo_accession ... tumour stage:ch1 (41 total)
##   varMetadata: labelDescription
## featureData: none
## experimentData: use 'experimentData(object)'
##   pubMedIds: 32380793 
## Annotation: GPL21145

获取β值矩阵非常简单:

beta.m <- exprs(GSE149282[[1]])
dim(beta.m)
## [1] 865918     24

beta.m[1:4,1:4]
##            GSM4495491 GSM4495492 GSM4495493 GSM4495494
## cg00000029  0.3680475  0.1580980  0.3562024  0.2530871
## cg00000103  0.7357062  0.5472209  0.7322839  0.5866429
## cg00000109  0.8182613  0.8746516  0.7908351  0.8354254
## cg00000155  0.9376374  0.9057370  0.8820246  0.8979353

这个β矩阵可能含有很多缺失值,需要去掉,不然会报错,你可以用各种缺失值插补的方法,这里我们就简单点,直接删除,在实际分析时不建议这么做!

beta.m <- na.omit(beta.m)
dim(beta.m)
## [1] 827476     24

有了这个β值矩阵,下面我们再把样本信息csv文件读取进来,上次推文中已经制作好了,直接读取即可:

pd <- read.csv("./gse149282/GSE149282_RAW/sample_type.csv")
head(pd)
##   Sample_Name              Sentrix_ID Sentrix_Position Sample_Type
## 1  GSM4495491 GSM4495491_200811050117           R01C01      normal
## 2  GSM4495492 GSM4495492_200811050117           R02C01      cancer
## 3  GSM4495493 GSM4495493_200811050117           R03C01      normal
## 4  GSM4495494 GSM4495494_200811050117           R04C01      cancer
## 5  GSM4495495 GSM4495495_200811050117           R05C01      normal
## 6  GSM4495496 GSM4495496_200811050117           R06C01      cancer

β值矩阵读取

现在有了β值和样本信息csv文件,我们就可以用ChAMP包分析了!

suppressMessages(library(ChAMP))

champ.load()是从IDAT开始的,包括champ.import()champ.filter()champ.import()也是从IDAT开始的,现在我们只有β矩阵,可以直接从champ.filter()开始!

myLoad <- champ.filter(beta = beta.m,
                       pd = pd,
                       arraytype = "EPIC"
                       )
[===========================]
[<<<< ChAMP.FILTER START >>>>>]
-----------------------------

In New version ChAMP, champ.filter() function has been set to do filtering on the result of champ.import(). You can use champ.import() + champ.filter() to do Data Loading, or set "method" parameter in champ.load() as "ChAMP" to get the same effect.

This function is provided for user need to do filtering on some beta (or M) matrix, which contained most filtering system in champ.load except beadcount. User need to input beta matrix, pd file themselves. If you want to do filterintg on detP matrix and Bead Count, you also need to input a detected P matrix and Bead Count information.

Note that if you want to filter more data matrix, say beta, M, intensity... please make sure they have exactly the same rownames and colnames.


[ Section 1:  Check Input Start ]
  You have inputed beta for Analysis.

  pd file provided, checking if it's in accord with Data Matrix...
    pd file check success.

  Parameter filterDetP is TRUE, checking if detP in accord with Data Matrix...
    !!! Parameter detP is not found, filterDetP is reset FALSE now.

  Parameter filterBeads is TRUE, checking if beadcount in accord with Data Matrix...
    !!! Parameter beadcount is not found, filterBeads is reset FALSE now.

  parameter autoimpute is TRUE. Checking if the conditions are fulfilled...
    !!! ProbeCutoff is 0, which means you have no needs to do imputation. autoimpute has been reset FALSE.

  Checking Finished :filterMultiHit,filterSNPs,filterNoCG,filterXY would be done on beta.
[ Section 1: Check Input Done ]


[ Section 2: Filtering Start >>

  Filtering NoCG Start
    Only Keep CpGs, removing 2792 probes from the analysis.

  Filtering SNPs Start
    Using general EPIC SNP list for filtering.
    Filtering probes with SNPs as identified in Zhou's Nucleic Acids Research Paper 2016.
    Removing 94704 probes from the analysis.

  Filtering MultiHit Start
    Filtering probes that align to multiple locations as identified in Nordlund et al
    Removing 10 probes from the analysis.

  Filtering XY Start
    Filtering probes located on X,Y chromosome, removing 16250 probes from the analysis.

  Updating PD file
    filterDetP parameter is FALSE, so no Sample Would be removed.

  Fixing Outliers Start
    Replacing all value smaller/equal to 0 with smallest positive value.
    Replacing all value greater/equal to 1 with largest value below 1..
[ Section 2: Filtering Done ]

 All filterings are Done, now you have 713720 probes and 24 samples.

[<<<<< ChAMP.FILTER END >>>>>>]
[===========================]
[You may want to process champ.QC() next.]

可以和上次直接从IDAT读取的对比一下,可以看到少了很多信息,所以有的过滤不能执行,比如filterDetP、filterBeads。

下面的分析就和上一篇推文一模一样了

# 数据预处理
champ.QC(beta = myLoad$beta,
         pheno = myLoad$pd$Sample_Type,
         resultsDir="./CHAMP_QCimages1/"
         ) 
myNorm <- champ.norm(beta = myLoad$beta,
                     arraytype = "EPIC",
                     #method = "PBC",
                     cores = 8,
                     resultsDir="./CHAMP_Normalization1/"
                     )
champ.SVD(beta = myNorm |> as.data.frame(), # 这里需要注意
          pd=myLoad$pd)
[===========================]
[<<<<< ChAMP.SVD START >>>>>]
-----------------------------
champ.SVD Results will be saved in ./CHAMP_SVDimages/ .

Your beta parameter is data.frame format. ChAMP is now changing it to matrix.
[SVD analysis will be proceed with 713720 probes and 24 samples.]


[ champ.SVD() will only check the dimensions between data and pd, instead if checking if Sample_Names are correctly matched (because some user may have no Sample_Names in their pd file),thus please make sure your pd file is in accord with your data sets (beta) and (rgSet).]

<Sentrix_ID>(character):GSM4495491, GSM4495492, GSM4495493, GSM4495494, GSM4495495, GSM4495496, GSM4495497, GSM4495498, GSM4495499, GSM4495500, GSM4495501, GSM4495502, GSM4495503, GSM4495504, GSM4495505, GSM4495506, GSM4495507, GSM4495508, GSM4495509, GSM4495510, GSM4495511, GSM4495512, GSM4495513, GSM4495514
<Sentrix_Position>(character):200811050117_R01C01, 200811050117_R02C01, 200811050117_R03C01, 200811050117_R04C01, 200811050117_R05C01, 200811050117_R06C01, 200811050117_R07C01, 200811050117_R08C01, 200811050116_R01C01, 200811050116_R02C01, 200811050116_R03C01, 200811050116_R04C01, 200811050116_R05C01, 200811050116_R06C01, 200811050116_R07C01, 200811050116_R08C01, 202193490061_R01C01, 202193490061_R02C01, 202193490061_R03C01, 202193490061_R04C01, 202193490061_R05C01, 202193490061_R06C01, 202193490061_R07C01, 202193490061_R08C01
<Sample_Type>(character):normal, cancer
[champ.SVD have automatically select ALL factors contain at least two different values from your pd(sample_sheet.csv), if you don't want to analysis some of them, please remove them manually from your pd variable then retry champ.SVD().]

<Sample_Name>
[Factors are ignored because they only indicate Name or Project, or they contain ONLY ONE value across all Samples.]

     Sentrix_ID Sentrix_Position  Sample_Type
[1,]  0.4607709        0.4607709 4.146041e-05
[2,]  0.4607709        0.4607709 9.406855e-02
[3,]  0.4607709        0.4607709 4.189234e-01
[4,]  0.4607709        0.4607709 3.263485e-01
[5,]  0.4607709        0.4607709 7.728300e-01

后续的分析和之前推文中介绍的一模一样,就不演示了,大家可以移步之前的推文:

16.ChAMP分析甲基化数据:标准流程

<think>嗯,用户想了解如何使用ChAMP在R中成用于甲基化数据分析的.csv样本息文件。我需要先回忆一下ChAMP的相关知识。ChAMP主要用于处理甲基化芯片数据,比如Illumina的450K或EPIC芯片。样本息文件通常含样本名称、分组、批次等息,这对后续分析很重要。 首先,用户可能需要知道样本息文件的具体格式要求。比如,必须含哪些列,比如Sample_Name、Sample_Group、Batch等。这些息在ChAMP的文档里应该有说明,所以需要确认正确的列名和结构。 然后,用户可能需要指导如何手动创建这样的CSV文件。比如使用Excel或文本编辑器,输入正确的列名和数据。但可能更常见的是通过R代码来自动成,特别是当样本数量较多时,或者需要从其他数据源导入息。 接下来,用户可能需要了解如何在R中读取或成这个CSV文件。比如使用data.frame创建数据框,然后使用write.csv保存。需要确保没有行名,并且字符串不被自动转换为因子,这可以通过stringsAsFactors参数来控制。 另外,用户可能会遇到一些常见问题,比如列名不正确导致ChAMP读取失败,或者路径错误。这时候需要提醒用户检查列名是否正确,文件路径是否准确,以及是否使用了正确的分隔符。 还有,用户可能不清楚样本息文件在后续分析中的具体作用。比如在过滤步骤champ.filter()中加载这个文件,用于后续的分组比较或批次校正。这时候需要说明文件的重要性,以及如何正确配置各列内容。 可能需要参考ChAMP的官方文档或Bioconductor的说明来确保息的准确性。比如引用相关的函数说明或教程链接,帮助用户进一步查阅资料。同时,注意示例中的代码是否正确,比如列名是否正确,是否有遗漏的必填字段。 用户可能还会问到如何处理批次效应,或者如何设置分组变量,这时候在成样本息文件时需要含Batch列,并在后续分析中使用champ.runCombat()进行处理。因此,在回答中可以提到这些列的作用,帮助用户理解文件的结构设计。 最后,确保回答结构清晰,分步骤说明手动创建和R代码成的方法,并提供常见问题解答,帮助用户排查错误。同时,成的相关问题可以引导用户进一步学习样本息文件的其他注意事项或ChAMP的其他功能。</think>### 如何使用ChAMP成.csv样本息文件 #### 步骤说明 1. **文件格式要求** - 必须含列:`Sample_Name`(样本ID)、`Sample_Group`(实验分组,如Control/Case) - 可选列:`Slide`(芯片编号)、`Array`(芯片位置)、`Batch`(批次息)等 - 示例文件结构: ```csv Sample_Name,Sample_Group,Slide,Array,Batch S1,Control,1,A1,1 S2,Case,1,B1,2 ``` 2. **手动创建方法** - 使用Excel或文本编辑器创建表格 - 按上述结构填写样本息 - 保存为`.csv`格式(注意编码为UTF-8) 3. **通过R代码成** ```r # 创建数据框 sample_info <- data.frame( Sample_Name = c("S1", "S2", "S3"), Sample_Group = c("Control", "Case", "Case"), Slide = c(1, 1, 2), Array = c("A1", "B1", "A1"), Batch = c(1, 2, 2), stringsAsFactors = FALSE ) # 保存为CSV文件 write.csv(sample_info, "sample_sheet.csv", row.names = FALSE) ``` 4. **在ChAMP中加载** ```r library(ChAMP) myLoad <- champ.load( directory = "IDAT文件路径", sampleSheet = "sample_sheet.csv" ) ``` #### 常见问题排查 1. **列名错误**:`Error: sample_sheet should contain Sample_Name` → 检查列名拼写 2. **路径错误**:`Cannot find file` → 确认文件路径和扩展名 3. **格式错误**:`Error in read.table` → 确保没有多余空格或特殊字符 #### 关键参数说明 - `Sample_Group`列必须含至少两个分组用于差异分析 - `Batch`列用于后续批次效应校正(`champ.runCombat()`) - 必须与IDAT文件名对应(默认匹配`Sample_Name`列)[^1]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值