OHDSI 相关内容 1



前言

最近在做的工作涉及到医学科研的内容,接触到了不少行业相关的三方软件,甲方爸爸最近强推OHDSI组织相关的软件.这里对整个研究的内容和过程进行一下记录,当前主要记录部署相关的工作
在这里插入图片描述


一、OHDSI简介

The Observational Health Data Sciences and Informatics (OHDSI 发音为 Odyssey–奥德赛[ˈɑːdəsi])
program is a multi-stakeholder, interdisciplinary collaborative to bring out the value of health data through large-scale analytics. All our solutions are open-source.
OHDSI has established an international network of researchers and observational health databases with a central coordinating center housed at Columbia University.

简单来说,这是一个基于国外OMOP组织提出的通用数据模型(OMOP-CDM)建立的,集科研队列创建,术语集管理,分析应用的开源组织.

OHDSI

本文中使用的软件版本如下:

  1. ATLAS 2.10.1
  2. WebAPI 2.10.1
  3. CDM 5.4

二、工具介绍

OHDSI软件工具 是目前官方提供的相关的软件列表,里面个人认为比较重要的软件有以下几个:

  • ATLAS 算是这个体系内容核心,主要用于科研数据队列创建,并提供了大量队列分析功能

  • ATHENA 很重要的一部分,术语集查询下载的软件,对应页面上没有找到能维护,修改术语集/术语的位置,可能个人看的还不是很到位,比较遗憾

  • ACHILLES 过程中很关键的一个R包,用于根据标准OMOP-CDM数据,生成可用于ATLAS展示的数据统计描述信息

  • DATA QUALITY DASHBOARD 数据质量仪表盘,名字很有迷惑性,还是个R包,在OMOP-CDM结构下,每个表,每个字段的量化不符合标准的数据

    其他的还有一大堆分析用的R包,以及向OMOP-CDM结构中,导入数据用的设计工具(没错,不是直接导入,而是会给你一个推荐的数据导入的设计,很神奇)

整套内容部署需要的环境,要求需要有java,需要有容器(我这里偷懒选择了tomcat),另外需要有数据库环境,我这里选择的postgreSQL
下面逐一说明几个重要的工具使用方法.


1.ATLAS

整套体系应用的核心,源码在Git上都有,同时提供了打包好的程序.
整个ATLAS可以分为三部分,CDM,WebAPI,Atlas前端

CDM

CDM的处理相对来说很简单,官方的Git上有对应各个版本OMOP-CDM的创建语句,并且有多种数据库的支持,这里需要注意的是,在未导入数据之前,不建议执行SQL中建立约束的部分,不然初始数据导入的时候会非常的麻烦.
通用数据集下载
本地CDM创建SLQ示例
执行很简单,对应数据库文件夹下,有相应的结构创建语句,直接执行就好了,建议针对CDM结构,单独创建库或者schema

Atlas

Atlas的部署需要依赖WebAPI,但是非常简单,所以放到前面来进行说明.
其实说白了,整个Atlas项目就是基于WebAPI的一套页面展示,编译好的代码,直接放到容器里就可以.
但是这里要注意的是,Atlas编译必须依赖Vue,编译环境上已经有的话,直接执行npm run build等待编译完成,将编译好的内容复制到容器里,修改 js/config/app.js文件中,开头的

appConfig.api = {
		name: 'Local', //应用展示名称,作用不大,感觉主要多个的情况下用于区分
		url: 'http://localhost:8080/WebAPI/'  //重要内容,需要修改成后面部署的WebAPI的地址
  };

WebAPI

重头戏来了,WebAPI.这是个部署起来比较麻烦,坑比较多的东西,官方的文档,还算是相对全面Install the OHDSI WebAPI
建议直接使用 PostgreSQL 作为WebAPI使用的数据库,官方说了,3.0往后不支持其他库
基本按照文档就可以走下来,这里主要说两点需要注意的地方:

1. 配置文件修改,需要修改的配置文件主要是 application.properties

15-22行,用于配置WebAPI的主要数据连接,这里的用户只需要有webapi(配置的schema)的权限就可以

#Primary DataSource
datasource.driverClassName=org.postgresql.Driver	#数据库连接驱动,基本不用动
datasource.url=jdbc:postgresql://host:port/db	#数据库连接地址
datasource.username=username	#数据库用户名
datasource.password=password	#数据库密码
datasource.dialect=postgresql	#数据库类型
datasource.ohdsi.schema=webapi	#WebAPI使用的模式名称
datasource.dialect.source=sql server	#感觉是支持SQL的版本,没修改过

31-37行 用于配置临时库,主要用来初始化WebAPI的,这里要注意的是,这个用户,嗯,需要有对应的几个Schema的建表,建模式的权限,所以最好直接给个admin,当然,这是偷懒做法 :>

#Flyway database change management.
#DataSource for Change Managment / Migration
flyway.enabled=true	#是否使用临时库构建的开关
flyway.datasource.driverClassName=org.postgresql.Driver	#数据库连接驱动,基本不用动
flyway.datasource.url=jdbc:postgresql://host:port/db	#数据库连接地址
flyway.datasource.username=username	#数据库用户名
flyway.datasource.password=password	#数据库密码

107-130行 开启安全的话需要配置,安全相关的一大堆参数,这里没做修改,所以略过 :>

2. 初始化数据源

这个是比较容易忽略的一点,因为同Atlas一样,WebAPI部署到容器后,只要没有什么问题,就能自动的初始化对应的程序库,结果库,但是,这时候访问Atlas的话,页面会提示没有配置数据源,需要转到数据源来配置,但是过去后发现没有可以配置的地方.
其实这里的数据源是直接通过WebAPI对应的数据库用户直接在数据库中执行SQL来创建的
CDM-Configuration官方的这个文档,就是说明如何添加数据源的.
示例SQl如下:

Example WebAPI SOURCE and SOURCE_DAIMON Inserts
INSERT INTO webapi.source (source_id, source_name, source_key, source_connection, source_dialect) 
SELECT nextval('webapi.source_sequence'), 'My Cdm', 'MY_CDM', ' jdbc:postgresql://server:5432/cdm?user={user}&password={password}', 'postgresql';

INSERT INTO webapi.source_daimon (source_daimon_id, source_id, daimon_type, table_qualifier, priority) 
SELECT nextval('webapi.source_daimon_sequence'), source_id, 0, 'cdm', 0
FROM webapi.source
WHERE source_key = 'MY_CDM'
;

INSERT INTO webapi.source_daimon (source_daimon_id, source_id, daimon_type, table_qualifier, priority) 
SELECT nextval('webapi.source_daimon_sequence'), source_id, 1, 'vocab', 1
FROM webapi.source
WHERE source_key = 'MY_CDM'
;

INSERT INTO webapi.source_daimon (source_daimon_id, source_id, daimon_type, table_qualifier, priority) 
SELECT nextval('webapi.source_daimon_sequence'), source_id, 2, 'results', 1
FROM webapi.source
WHERE source_key = 'MY_CDM'
;

INSERT INTO webapi.source_daimon (source_daimon_id, source_id, daimon_type, table_qualifier, priority) 
SELECT nextval('webapi.source_daimon_sequence'), source_id, 5, 'temp', 0
FROM webapi.source
WHERE source_key = 'MY_CDM'
;

执行完成后,再转到对应的配置页面的时候就能看到内容,并且Atlas页面能够正常打开了,至此,整个Atlas部署完成,但是要是想使用的话,还需要结合其他内容

2022-04-21 15:52:13 这里大意了,插入完数据后,还必须访问WebAPI的接口,用于刷新焕春中保存额数据源信息 http://${host}:${port}/WebAPI/source/refresh


2.Athena

OHDSI中重要的组成部分,也是Atlas想要跑通的话,必须要使用到的东西,这里建议直接使用官方的环境,
Athena的作用就是提供了一个术语查询下载的平台,官方提供的代码,目前没有发现有可以页面维护术语的地方.
下载好的术语会以多个csv的方式存在,直接使用官方的 OMOP CDM vocabulary load - PostgreSQL.sql加载到WebAPI中配置的CDM库中即可
核心代码如下,当然你需要改成自己的配置

\COPY DRUG_STRENGTH FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/DRUG_STRENGTH.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY CONCEPT FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/CONCEPT.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY CONCEPT_RELATIONSHIP FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/CONCEPT_RELATIONSHIP.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY CONCEPT_ANCESTOR FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/CONCEPT_ANCESTOR.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY CONCEPT_SYNONYM FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/CONCEPT_SYNONYM.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY VOCABULARY FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/VOCABULARY.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY RELATIONSHIP FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/RELATIONSHIP.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY CONCEPT_CLASS FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/CONCEPT_CLASS.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY DOMAIN FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/DOMAIN.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;
\COPY CONCEPT_NUMERIC FROM '/Users/mjg994/Documents/source/OncologyWG/etl/naaccr-etl/db/migrate/CommonDataModel-5.3.1/PostgreSQL/VocabImport/CONCEPT_NUMERIC.csv' WITH DELIMITER E'\t' CSV HEADER QUOTE E'\b' ;

成功的将术语集加载到数据库后,Atlas页面上才开始能看到东西,但是这还没结束,现在只是看到内容了,具离能用还有很关键的一步------灌入数据
这里主要说明工具软件,如何灌数,这里就不说了,也可以下载公开数据直接导入


3.Achilles

全都准备完成后,就可以使用Achilles,对库中的数据进行基本的统计描述性分析了.
由于Achilles的执行是采用的R包的方式,也就是说你需要一个可以运行R代码的环境,这里建议安装新版本的64位R程序.
Achilles执行代码:

install.packages("remotes")
remotes::install_github("OHDSI/Achilles")
library(Achilles)
#指定数据库驱动存放目录
Sys.setenv(DATABASECONNECTOR_JAR_FOLDER='${your_file_path}')
#下载驱动,并同时创建dbms
downloadJdbcDrivers(dbms = "postgresql",pathToDriver = Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"),
                    method = "auto")
#连接数据库
connectionDetails <- createConnectionDetails(dbms = "postgresql",
                                             server = "jdbc:postgresql://${host}:${port}/${db}",
                                             user = "${username}",
                                             password = "${password}")
#运行achilles
achilles(connectionDetails = connectionDetails,
         cdmDatabaseSchema = "${cdm_schema}",
         resultsDatabaseSchema = "${results_schema}",
         outputFolder = "${output}")
createIndices(connectionDetails = connectionDetails,
              resultsDatabaseSchema = "${results_schema}",
              outputFolder = "${output}")

这里可能存在数据库无法连接,执行不了的情况,可以在具体调用的achilles方法中,增加一个参数,生成对应SQL,自己放到CDM的数据库中执行,当然这种方式的话,推荐是在是无法直接通过R代码连接到数据库的情况

结语

到这里OHDSI相关的核心内容部署基本就完成了,当然DQD的内容和Achilles基本类似,所以直接略过了.整体来说,这是一套部署起来比较复杂的程序,当然,后续使用过程中,还会有更多很麻烦的地方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值