孟德尔随机化(四)—— 遇到 Error in if (nrow(d) == 0) return(NULL) : 参数长度为零?

文摘   2024-07-11 09:07   马来西亚  

俺要要要终于回来啦!!!今天!咱就帮助大家解决一个困扰多日的问题!是什么呢!铛铛铛铛!就是近期大家在孟德尔随机化分析中最常遇到的Error in if (out == "[]") { : argument is of length zeroError in if (nrow(d) == 0) return(NULL) : 参数长度为零!相信大家一定遇到过!因为我发现,私信和留言,还有交流群内,都快被这个问题刷屏了,而且似乎也没有什么好的解决方案出现!这是咱们使用之前在看完不会来揍我 | 孟德尔随机化万字长文详解(二)—— 代码实操 | 附代码注释 + 结果解读中的方法在线从 GWAS 数据库下载数据时会遇到的情况,真是让我们一筹莫展、二脸懵逼、三阳开泰、四处碰壁、「五」可奈何、六六不顺、七上八下、「八」酒消愁、「九」命呀!

咱不慌!今天!一个偶然的情况下,我突然灵光乍现!就那么一试!哎呀!果然!居然搞定了!谢天谢地!可歌可泣啊!来!咱们一起看看!



首先检查token是否设置成功

有时候在线从 GWAS 数据库下载数据失败,我们都会以为是服务器或网络等的问题,有时候确实是哈,后来查询(https://github.com/MRCIEU/TwoSampleMR/issues/448)才发现,从 2024 年 5 之后都需要设置 token 才可以继续访问服务器。那如果咱们还没有设置过 token 的话,记得要先设置哟!详见:https://mrcieu.github.io/ieugwasr/articles/guide.html

咱们这里简单介绍一下:

要进行身份验证,您需要从 OpenGWAS 网站生成一个令牌。这个令牌就像密码一样,用于授权您对 OpenGWAS API 的请求。以下是生成令牌并让其自动用于查询的步骤:

  1. 登录 https://api.opengwas.io/profile/
  2. 生成一个新令牌
  3. <token> 添加到您的 .Renviron 文件中。此文件可以在您的主目录中,也可以在您的 R 会话的工作目录中。您可以通过在 R 中运行 Sys.getenv("R_ENVIRON_USER") 来检查 .Renviron 文件的位置。
  4. 重启您的 R 会话
  5. 要检查您的令牌是否被识别,请运行 ieugwasr::get_opengwas_jwt()。如果返回一个长的随机字符串,则表示您已通过身份验证。
  6. 要检查您的令牌是否正常工作,请运行 user()。它将使用您的令牌向 API 发出请求以获取您的用户信息。它应该返回一个包含您的用户信息的列表。如果返回错误,则表示您的令牌无法正常工作。

现在,任何对 OpenGWAS 的查询都会自动包含您的令牌以授权请求。

咱们设置完之后,就像这样:

红框框就是 OpenGWAS 网站生成的 token 啦!绿框框是 GitHub 的 token 哈哈哈哈哈哈!

彻底解决那个讨厌的报错

来!现在!咱们来现场从 GWAS 数据库在线下载一个暴露数据试试看!

# 加载包包
library(TwoSampleMR)

# 从 GWAS 数据库下载数据
exposure_data <- extract_instruments(
  outcomes = "ukb-b-16639",         # 指定 GWAS 数据集
  p1 = 5e-08,                       # 过滤 SNP 的 p 值阈值
  clump = TRUE,                     # 进行 SNP clumping
  r2 = 0.001,                       # clumping 的 r^2 阈值
  kb = 10000                        # clumping 的窗口大小
)

看!果不其然!报错了吧!报错如下!是不是看到它就头秃!放心!今天过后,它就是咱们的手下败将!!!

Error in if (out == "[]") { : argument is of length zero

呐!咱把 P 值阈值设宽松一点试试呢?比如像下面这样,把p1 = 5e-08改成p1 = 5e-06

exposure_data <- extract_instruments(
  outcomes = "ukb-b-16639",  # 指定 GWAS 数据集
  p1 = 5e-06,                       # 过滤 SNP 的 p 值阈值
  clump = TRUE,                     # 进行 SNP clumping
  r2 = 0.001,                       # clumping 的 r^2 阈值
  kb = 10000                        # clumping 的窗口大小
)

exposure_data
#   pval.exposure pos.exposure beta.exposure se.exposure samplesize.exposure chr.exposure id.exposure       SNP effect_allele.exposure
# 1   4.70002e-06     80464745   -0.00336713 0.000735449               64949           12 ukb-b-16639 rs7315575                      A
#   other_allele.exposure eaf.exposure           exposure mr_keep.exposure pval_origin.exposure data_source.exposure
# 1                     C      0.65584  || id:ukb-b-16639             TRUE             reported                  igd

哎呀呀!成功了呢!哎嘿嘿!

看看看看!咱都把 P 值阈值设为 5e-06了,才筛到一个符合的 SNP,可想而知!5e-08 的 P 值阈值,那可不什么都得不到嘛!自然它就报错啦!应该是它的源代码内部的编写问题,有兴趣的小伙伴也可以自己去修改一下源代码哈哈哈哈哈,让它即使没筛到 SNP 也可以继续运行下去!不过咱们现在已经知道这个报错的原因啦!是否需要它不报错是不是也就不重要啦哈哈哈哈哈!

那以后咱们如果遇到Error in if (out == "[]") { : argument is of length zeroError in if (nrow(d) == 0) return(NULL) : 参数长度为零这类报错,是不是就知道该怎么办啦!哎对!没错!把过滤 SNP 的 P 值阈值默认参数p1 = 5e-08改成p1 = 5e-06试试!如果还不行,建议换数据集哈哈哈哈哈哈!因为这算是公认的底线!好多文章最宽松的 P 值阈值也就是 5e-06 而已!不建议更宽松啦!

文末碎碎念

那今天的分享就到这里啦!我们下期再见哟!

最后顺便给自己推荐一下嘿嘿嘿!

如果我的分享对你有用的话,欢迎关注点赞在看转发分享阿巴阿巴阿巴阿巴巴巴!这可是我的第一原动力!

蟹蟹你们的喜欢和支持!!!

生信小白要知道
主打小白保姆级教程,因为自己淋过雨,所以想给大家撑把伞! 记录从小白到现在小灰的过程,希望以后可以成为小黑!
 最新文章