【问题标题】:Loop through columns in S4 objects in R循环遍历 R 中 S4 对象中的列
【发布时间】:2023-03-28 08:25:01
【问题描述】:

我正在尝试使用 snpStats 包执行关联。

我有一个名为“plink”的 snp 矩阵,其中包含我的基因型数据(如 $genotypes、$map、$fam) 和 plink$genotype 的列表具有:SNP 名称作为列名(2 个 SNP),主题标识符作为行名:

plink$genotype
SnpMatrix with  6 rows and  2 columns
Row names:  1 ... 6 
Col names:  203 204

可以复制以下 ped 和 map 文件并分别保存为“plink.ped”和 plink.map 来复制 plink 数据集:

plink.ped:

1 1 0 0 1 -9 A A G G
2 2 0 0 2 -9 G A G G
3 3 0 0 1 -9 A A G G
4 4 0 0 1 -9 A A G G
5 5 0 0 1 -9 A A G G
6 6 0 0 2 -9 G A G G

plink.map:

1 203 0 792429
2 204 0 819185

然后这样使用plink:

./plink --file plink --make-bed

@----------------------------------------------------------@
|        PLINK!       |     v1.07      |   10/Aug/2009     |
|----------------------------------------------------------|
|  (C) 2009 Shaun Purcell, GNU General Public License, v2  |
|----------------------------------------------------------|
|  For documentation, citation & bug-report instructions:  |
|        http://pngu.mgh.harvard.edu/purcell/plink/        |
@----------------------------------------------------------@

Web-based version check ( --noweb to skip )
Recent cached web-check found...Problem connecting to web

Writing this text to log file [ plink.log ]
Analysis started: Tue Nov 29 18:08:18 2011

Options in effect:
--file /ugi/home/claudiagiambartolomei/Desktop/plink
--make-bed

 2 (of 2) markers to be included from [ /ugi/home/claudiagiambartolomei/Desktop   /plink.map ]
 6 individuals read from [ /ugi/home/claudiagiambartolomei/Desktop/plink.ped ] 
 0 individuals with nonmissing phenotypes
Assuming a disease phenotype (1=unaff, 2=aff, 0=miss)
Missing phenotype value is also -9
0 cases, 0 controls and 6 missing
4 males, 2 females, and 0 of unspecified sex
Before frequency and genotyping pruning, there are 2 SNPs
6 founders and 0 non-founders found
Total genotyping rate in remaining individuals is 1
0 SNPs failed missingness test ( GENO > 1 )
0 SNPs failed frequency test ( MAF < 0 )
After frequency and genotyping pruning, there are 2 SNPs
After filtering, 0 cases, 0 controls and 6 missing
After filtering, 4 males, 2 females, and 0 of unspecified sex
Writing pedigree information to [ plink.fam ] 
Writing map (extended format) information to [ plink.bim ] 
Writing genotype bitfile to [ plink.bed ] 
Using (default) SNP-major mode

Analysis finished: Tue Nov 29 18:08:18 2011

我还有一个表型数据框,其中包含我想与基因型关联的结果(结果 1、结果 2、...),即:

ID<- 1:6
sex<- rep(1,6)
age<- c(59,60,54,48,46,50)
bmi<- c(26,28,22,20,23, NA)
ldl<- c(5, 3, 5, 4, 2, NA)
pheno<- data.frame(ID,sex,age,bmi,ldl)

当我这样做时,该关联适用于单个术语:(使用公式“snp.rhs.test”):

bmi<-snp.rhs.tests(bmi~sex+age,family="gaussian", data=pheno, snp.data=plink$genotype)

我的问题是,如何循环查看结果?这类数据 似乎与其他所有人不同,我遇到了麻烦 操纵它,所以如果您有建议,我也将不胜感激 一些教程可以帮助我理解如何做到这一点和其他 例如,对 snp.matrix 数据进行子集化等操作。

这是我为循环尝试过的:

rhs <- function(x) { 
x<- snp.rhs.tests(x, family="gaussian", data=pheno, 
snp.data=plink$genotype) 
} 
res_ <- apply(pheno,2,rhs) 

Error in x$terms : $ operator is invalid for atomic vectors

然后我尝试了这个:

for (cov in names(pheno)) { 
 association<-snp.rhs.tests(cov, family="gaussian",data=pheno, snp.data=plink$genotype) 
 } 

Error in eval(expr, envir, enclos) : object 'bmi' not found

一如既往地感谢您的帮助! -f

【问题讨论】:

  • 您有示例数据集供我们使用吗?
  • 你不能在矩阵上使用$,而是使用snp.matrix[,"genotype"]
  • 很抱歉给您带来了困惑,我很抱歉让我的问题更清楚,如果这仍然令人困惑,我将尝试添加 plink 中生成的 snpmatrix 数据...
  • @user971102:您仍然缺少plink 变量,因此该示例还不能重现。请提供。
  • 如果您只是发布 dput(plink) 会容易得多,而不是建议我们安装另一个(非 R)程序。

标签: r loops s4


【解决方案1】:

snpStats 的作者是 David Clayton。尽管包描述中列出的网站是错误的,但他仍在该域中,并且可以使用 Google 的高级搜索功能使用此规范搜索文档:

snpStats site:https://www-gene.cimr.cam.ac.uk/staff/clayton/

访问困难的可能原因是这是一个 S4 包,访问方法不同。 S4 对象通常具有显示方法,而不是打印方法。这里的包装上有一个小插图:https://www-gene.cimr.cam.ac.uk/staff/clayton/courses/florence11/practicals/practical6.pdf,他的整个短期课程的目录可供访问:https://www-gene.cimr.cam.ac.uk/staff/clayton/courses/florence11/

很明显,从 snp.rhs.tests 返回的对象可以使用“[”使用序号或名称访问,如第 7 页所示。您可以获得名称:

# Using the example on the help(snp.rhs.tests) page:

> names(slt3)
 [1] "173760" "173761" "173762" "173767" "173769" "173770" "173772" "173774"
 [9] "173775" "173776"

你可能称之为列的东西可能是“槽”

> getSlots(class(slt3))
  snp.names   var.names       chisq          df           N 
      "ANY" "character"   "numeric"   "integer"   "integer" 
> str(getSlots(class(slt3)))
 Named chr [1:5] "ANY" "character" "numeric" "integer" "integer"
 - attr(*, "names")= chr [1:5] "snp.names" "var.names" "chisq" "df" ...
> names(getSlots(class(slt3)))
[1] "snp.names" "var.names" "chisq"     "df"        "N"        

但是没有[i,j] 方法可以循环这些插槽名称。您应该转至帮助页面 ?"GlmTests-class",其中列出了为该 S4 类定义的方法。

【讨论】:

    【解决方案2】:

    完成初始海报所需的正确方法是:

    for (i in ncol(pheno)) { 
      association <- snp.rhs.tests(pheno[,i], family="gaussian", snp.data=plink$genotype) 
    }
    

    snp.rhs.tests() 的文档说,如果缺少数据,则从父框架中获取表型 - 或者可能是相反的措辞:如果指定了数据,则在指定的 data.frame 中评估表型.

    这是一个更清晰的版本:

    for (i in ncol(pheno)) {
      cc <-  pheno[,i]
      association <- snp.rhs.tests(cc, family="gaussian", snp.data=plink$genotype) 
    }
    

    【讨论】:

      【解决方案3】:

      文档说data=parent.frame()snp.rhs.tests() 中的默认值。

      apply() 代码中有一个明显的错误 - 请不要使用x &lt;- some.fun(x),因为它会造成非常糟糕的事情。试试这个 - 删除 data=,并使用不同的变量名。

      rhs <- function(x) { 
      y<- snp.rhs.tests(x, family="gaussian", snp.data=plink$genotype) 
      } 
      res_ <- apply(pheno,2,rhs)
      

      最初发帖人的问题也具有误导性。

      plink$genotype 是一个 S4 对象,pheno 是一个 data.frame(一个 S3 对象)。您真的只想在 S3 data.frame 中选择列,但是 snp.rhs.tests() 如何查找列(如果给出了 data.frame)或一个向量表型(如果它作为一个普通向量给出 - 即在父框架或您的“当前”框架中,因为子程序在“子”框架中评估!)

      【讨论】:

        猜你喜欢
        • 2020-01-28
        • 1970-01-01
        • 2010-12-09
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多