开源R管道清洁和处理患者级医院发作统计(HES)并链接了ONS死亡率数据,目的是生成准备分析的数据集,以进行定义的分析程序。
医院情节统计(HES)是一个数据库,其中包含在英格兰NHS医院的所有招待会,急诊室和门诊任命的详细信息。
在将其用于分析之前,HES数据需要清洁,质量控制和处理才能得出其他变量。从分析和计算的角度来看,HES的复杂记录结构,大量变量和数据集的大小使这是一个具有挑战性的任务。
我们在此存储库过程中开发的半自动化工作流程始终且可重复地将所有处理步骤记录在HES数据中,旨在确保每个批准的分析项目基于相同的清洁数据。
从2008/09到最近发布的季度发布,我们使用与ONS死亡率数据链接的HES数据。我们的数据应用程序已由NHS Digital [数据访问请求服务访问请求服务(DARS)批准。
数据将在卫生基金会的安全数据环境中访问;安全的数据分析设施(已获得ISO27001信息安全标准的认可,并以NHS数字数据安全和保护工具包认可)。不会使用直接识别患者或其他人的信息。
DOC文件夹包含有关:
此外,下面的部分描述了
由于本管道中准备的HES数据尚未公开,因此代码不能用于复制相同的清洁数据和数据库。但是,该代码可以在类似的患者级HES提取物上使用,以准备数据集进行分析。有关管道如何工作的更多详细信息,请参见下面或参考过程文档。
该过程文档描述了管道的整体设计,列出了工作流程中的步骤的必要输入和高级描述。
流程图显示了用户输入和数据如何通过不同管道功能移动。
管道可以通过两种模式运行:
update = TRUE )。 HES数据更新在同一年重叠,因此一些旧数据将被删除并替换为新更新。每个数据更新都会完全刷新ONS死亡率数据。在构建模式下,管道
在更新模式下,管道
体系结构决策记录(ADR)捕获了建筑决策和设计选择,以及他们的背景,理由和后果。此外,我们记录了一些分析决策。
到目前为止,我们已经记录了有关的决定
HES管道是根据R 3.6.2版(2019-12-12)建造的 - “黑暗而暴风雨的夜晚”。
运行hES管道需要以下r套件:
创建数据库的位置需要具有足够的存储空间,大致相当于RAW HES数据提取物的组合文件大小以及APC数据集的2 x文件大小(作为住院法术的表和连续的住院咒语的表格添加)。
某些处理步骤不是在内存中执行的,而是作为SQLite查询。这包括重复的标记算法,咒语创建和清洁数据上的摘要统计表的创建。根据数据集的大小,这些步骤会创建大型临时SQLITE数据库(.ETIQLS文件),一旦执行查询,它们就会自动删除。默认情况下,这些是在R主目录中创建的,该目录通常位于具有限制存储容量的驱动器上。
我们发现,当没有足够的临时存储可用时,Pieline的执行失败(错误消息“数据库或磁盘已满”)。可以通过更改创建临时SQLite数据库的位置来解决这。在Windows上,临时存储位置由环境变量“ TMP”控制。我们建议创建一个项目级别的.renviron文件,以将TMP设置为具有足够存储容量的位置。
data_path路径到HES数据提取。
该管道可以处理以下任何患者级数据集:HE承认患者护理,事故和紧急情况,HES OUPTATITER CARA,HES CARIVE CARE和ONS死亡率记录(包括将其链接到HES的桥梁文件)。它需要其中至少一个。原始数据文件必须位于同一文件夹中。
database_path路径通往将构建SQLite数据库的文件夹。
data_set_codes预期hes hes数据data_path数据集中的数据集。
这应该是“ APC”,“ AE”,“ CC”和“ OP”的一个或几个。这些标识符与原始文件的名称匹配,这对于从NHS Digital收到的RAW HES文件应该是这种情况。默认情况下,默认情况下处理了ONS死亡率记录和ONS-HES桥梁文件。死亡率记录和桥梁文件的文件名应分别包含“ ONS”和“ BF”。
CSV文件的expected_headers_file路径,每个数据集都有预期列名。
该CSV文件至少有两个列,名为colnames和dataset ,类似于此模板。读取数据时,数据中的列标题会自动化,因此CSV文件中的列名应为所有CAPS。此信息将用于检查每个原始数据文件是否包含所有预期列。
以下参数具有默认设置:
chunk_sizes为每个数据集的每个块的行数。
每个数据文件都会在许多行的碎片中读取和处理。默认尺寸为每块的100万行,但用户可以修改。较大的块尺寸,每个文件的块数量较少,减少了整体处理时间。这可能是因为对于给定文件中的每个块, fread()需要逐渐更长的时间才能移动到指定的行号才能开始读取数据。但是,大块尺寸也增加了处理记忆中每个块的时间。最佳块大小平衡处理时间与阅读时间的处理时间,并且取决于系统和数据集,因为每个数据集都可以具有不同数量的变量,因此每行需要不同量的内存。建议首先在较小的数据子集上进行测试,因为很大的块尺寸可能会导致Rstudio崩溃。
coerce胁迫数据类型。
默认情况下,用于在数据中读取的fread()函数将自动检测列类型。
另外,可以通过将此参数设置为TRUE将数据类型胁迫到用户定义的类型。在CSV文件中提供了带有预期列名称的CSV文件中的第三列,称为type ,请参见此模板。请注意,SQLite没有日期数据类型。日期变量需要存储为字符,因此应将其列为CSV文件中的字符。
IMD_2014_csv , IMD_2019_csv和CCG_xlsx通路通向包含要合并的参考数据的文件。
当前可以合并到每个记录的其他参考数据包括多重剥夺的索引(IMD),2015年和/或2019年版本以及CCG标识符。应提供参考文件的文件路径作为参数,并将在患者LSOA11上连接。包含LSOA11至IMD映射的CSV文件需要具有一个以“ LSOA代码”开头的列名,该名称包含“多剥夺(IMD)等级的索引”和包含“多剥夺索引”的列名称的列名。 (IMD)十分列。可以从gov.uk下载IMD 2015和IMD 2019的查找文件(文件7:剥夺指数的所有等级,十分位和分数以及人口分母)。可以从NHS Digital下载CCG标识符的查找文件(File:X-随着时间的推移更改为CCG-DCO-STP映射)。
update开关管道模式。
通过将此参数设置为TRUE ,将管道模式从构建模式切换到更新模式。
duplicate标记重复记录。
将在APC,A&E和OP数据集中创建其他列,该数据集指示是否将此argumet设置为TRUE ,是否有可能重复记录。可以在(derived_variables.md)中找到定义和派生规则。警告:这将大大增加管道的运行时间。
comorbiditees的合并症。
如果将此参数设置为TRUE ,则将在APC数据集中创建其他列,包括针对单个条件的标志,并加权和未加权的Charlson和Elixhauser分数(另请参见R package colorbity的文档)。此外,管道标志条件与脆弱的条件并计算自定义脆弱指数(请参阅?)。警告:这将大大增加管道的运行时间。
目前,该管道旨在在RSTUDIO会话中运行。从r控制台编译代码:
> source("pipeline.R")
然后呼叫pipeline() ,作为参数提供数据目录的路径,通往SQLITE数据库目录的路径,数据集代码的向量,通往带有预期列的CSV的路径,嵌入数据集代码和数据类型,可选的每个数据集的时间读取的行数的向量,如有需要,以及一个布尔值以启用胁迫。数据将被处理并写入数据库。 NB这是一个缓慢的过程,并且需要大量的内存来运行。
示例运行:
> pipeline(data_path = "/home/user/raw-data/", database_path = "/home/user/database-dir/", data_set_codes = c("APC", "AE", "CC", "OP"), chunk_sizes = c(2000000, 5000000, 2000000, 3000000), expected_headers_file = "/home/user/expected_columns.csv", IMD_15_csv = "IMD_2015_LSOA.csv", IMD_19_csv = "IMD_2019_LSOA.csv", CCG_xlsx = "xchanges-to-ccg-dco-stp-mappings-over-time.xlsx", coerce = TRUE, update = FALSE, duplicates = FALSE, comorbidities = FALSE)
对于如何从R查询SQLITE数据库的指南,例如,请参见使用R的RSTUDIO教程数据库。
可以查询数据库:
library( tidyverse )
library( dbplyr )
library ( DBI )
con <- dbConnect( RSQLite :: SQLite(), paste0( database_path , " HES_db.sqlite " ))
# List available tables
dbListTables( con )
# List available variables in the A&E table
dbListFields( con , " AE " )
# Option 1: Query using dbplyr
# Select table
AE <- tbl( con , ' AE ' )
# Look at the first 5 rows
AE % > %
head() % > %
collect()
# Option 2: Query using SQL
dbGetQuery( con , ' SELECT * FROM AE LIMIT 5 ' )
dbDisconnect( con )如果您使用的是DBI,请使用dbGetQuery()函数。避免使用可以修改基础数据库的函数,例如dbExecute() , dbSendQuery()或dbSendStatement() 。
该项目已根据MIT许可获得许可。