R语言-核对病案首页内容

本文3778字〡5图

2019年1月30日,国办4号文件《国务院办公厅关于加强三级公立医院绩效考核工作的意见》发布,拉开了三级公立医院“赶考”的大幕。《意见》中提出绩效考核结果的应用场景:作为公立医院发展规划、重大项目立项、财政投入、经费核拨、绩效工资总量核定、医保政策调整的重要依据,同时与医院评审评价、国家医学中心和区域医疗中心建设以及各项评优评先工作紧密结合。

另外,绩效考核结果作为选拔任用公立医院党组织书记、院长和领导班子成员的重要参考。压力层层传导至医院,因此各医院高度重视数据填报工作,而且填报的数据必须经医院法人审核。
绩效考核指标体系包括:医疗质量运营效率持续发展满意度评价4个方面共55个指标,其中26个指标为国家监测指标。部分指标直击医院管理运行的“命门”,撸掉医院遮羞的“底裤”,被迫亮出“家底”。
如观察医院功能定位情况指标:门诊与出院人次数比、下转患者人次数、日间手术占、微创手术占比、四级手术占比。 反映医疗质量安全指标:手术患者并发症发生率、Ⅰ类切口手术部位感染率、10个单病种的死亡率、DRG低风险组病例死亡率。 反映收支结构指标:门诊收入占比、医保基金回款、医疗服务收入、人员支出占比、资产负债率。
总体来讲,全国性的三级公立医院绩效考核有利于从国家层面加强宏观调控,提高医疗资源配置与利用效率,落实医改成效,对医院、患者和国家来说都是一件有益的事情。

2019年4月17日,国家卫生健康委办公厅、国家中医药局办公室联合发布了《关于启动2019年全国三级公立医院绩效考核有关工作的通知》,明确了数据上传和填报要求、时间节点,正式启动这项重大的开创性工作。

确保绩效考核数据客观真实可比,加强住院病案首页质量管理,提升首页数据质量,关于病案首页填报及上传做出如下要求:

全国三级公立医院(含三级公立中医医院)要按照要求认真完成住院病案首页数据填报及上传工作,规范使用2011年修订版住院病案首页;使用统一的疾病编码和手术操作编码;使用统一的上传接口标准;加强住院病案首页质量管理。

各地卫生健康行政部门要充分认识提高住院病案首页数据质量、编码字典库转换的重要意义,建立协调推进机制,强化组织领导,保障住院首页数据的上传质量。

国家病案管理质控中心、中国中医科学院中医药数据中心、各省级病案管理质控中心要组织开展住院病案首页质量督导检查、医疗机构编码转换质量抽查,监督指导属地医疗机构将首页数据质控和上传工作落到实处。

1三级公立医院绩效考核首页数据采集接口标准

现行三套首页数据采集接口标准分别为:《三级公立医院绩效考核住院病案首页数据采集质量与接口标准》;国家医疗质量监测系统《住院病案首页数据采集接口标准》;省卫生计生综合统计信息平台《病案首页数据接口规范》。

《三级公立医院绩效考核病案首页》将采集字段项目扩展至642项,主要是将出院其他诊断、其他手术操作各扩展到40个,共520个字段;HQMS病案首页中诊断、手术各有10个;省级卫生计生综合统计信息平台病案首页中诊断15个、手术操作10个(以湖北省为例)。
《三级公立医院绩效考核病案首页》采集的642个字段可分类如下:

△三级公立医院绩效考核病案首页采集的642个字段

2为什么要核对病案首页内容?

全国三级公立医院绩效考核首页数据通过前置机程序上传至HQMS系统,系统自带了23个数据关联校验规则,主要是对数据逻辑性及关联性进行校验,平台及校验规则如下所示:

△HQMS平台

△首页关联规则校验

但是,病案首页数据上传后无法查看形成的统计报表,各字段是否真实反映院内首页内容,还是未知的。由于A医院首页系统的数据库表结构较为复杂,由第三方厂家维护,提供给医院的是带有综合查询功能的GUI界面。加之,出院患者接近6万,整个表的元素达到3800多万(60000*642),在WPS软件中进行数据筛选或者分类汇总显得有些吃力。

因此考虑将数据导入R语言进行核对,一方面可以采用查询、筛选函数;另一方面考虑采用统计函数,然后与院内首页GUI查询结果比对。

3在R语言中应用SQL语句查询、筛选数据

原计划是将数据包导入到MySQL可视化管理工具Navicat中,无奈导入过程不断报错,遂放弃。但是在R语言中可以通过sqldf包实现SQL语句查询、筛选。如果对首页系统的数据库比较熟悉,也可通过RMySQL包连接到MySQL数据库。

数据读入、加载sqldf包,如下所示:

mydata <- read.csv(file = 'C:/Users/Administrator/Desktop/hqmsts_2019M1-82.csv') #读入首页csv数据head(mydata) #查看前6行数据library(sqldf) #载入sqldf包

下面三个查询分别为:年龄在50岁到80岁之间的病案门急诊诊断含有肺炎的病案出院病房为儿科III病区和肾脏病内科的病案。语句和SQL一样,都是使用Select语句检索,如下所示:

sqldf('select * from mydata where A14 between 50 and 80')  #查询年龄在50岁到80岁之间的病案        A01      A02 A46C A12C A14 A21C A38C A19C A33C B11C B13C        B14 B16C        B17 B20        C01C          C02N1 888888888 XXXX医院  9.0    1  60    2   90    1    2    1   28 重症医学科  403   脊柱外科   3 S12.200x041    颈椎骨折C62 888888888 XXXX医院  3.1    2  52    2   90    1    1    1   28 重症医学科   28 重症医学科   3     J96.900      呼吸衰竭3 888888888 XXXX医院  1.1    2  78    2   90   11    3    2   28 重症医学科  306 肾脏病内科   1     N18.001 慢性肾脏病5期4 888888888 XXXX医院  7.0    1  69    2   27    1    2    1   28 重症医学科  28 重症医学科    3     T60.001    有机磷中毒
sqldf('select * from mydata where C02N like '%肺炎%'') #查询门急诊诊断含有肺炎的病 A01 A02 A46C A12C A14 A21C A38C A19C A33C B11C B13C B14 B16C B17 B20 C01C C02N1 888888888 XXXX医院 2.1 2 0 1 90 1 5 2 28 重症医学科 7 儿科Ⅲ病区 7 J18.000x001 喘息性支气管肺炎2 888888888 XXXX医院 7.0 1 0 1 90 1 5 2 28 重症医学科 28 重症医学科 2 J18.000x001 喘息性支气管肺炎3 888888888 XXXX医院 7.0 1 0 1 90 1 5 1 28 重症医学科 28 重症医学科 1 J18.903 重症肺炎
sqldf('select * from mydata where B17 in ('儿科Ⅲ病区', '肾脏病内科')')  #查询出院病房为儿科III病区和肾脏病内科的病案        A01      A02 A46C A12C A14 A21C A38C A19C A33C B11C B13C        B14 B16C        B17 B20        C01C             C02N1 888888888 XXXX医院  2.1    2   0    1   90    1    5    2   28 重症医学科    7  儿科Ⅲ病区   7 J18.000x001 喘息性支气管肺炎2 888888888 XXXX医院  1.1    2  78    2   90   11    3    2   28 重症医学科  306 肾脏病内科   1     N18.001    慢性肾脏病5期
此外,subset() 子集合函数也可实现上述查询结果,语句如下:
subset(mydata, A12C == 2) #年龄在50岁到80岁之间的病案subset(mydata, A14 >= 50 & A14 <= 80) #年龄在50岁到80岁之间的病案subset(mydata, grepl('肺炎', C02N)) #门急诊诊断含有肺炎的病案
最后,可以利用identical() 函数比较sqldf包的SQL语句和subset() 子集合函数的结果是否一致,如下所示:
feiyan1 <- sqldf('select * from mydata where  C02N like '%肺炎%'', row.names = TRUE)  #查询门急诊诊断含有肺炎的病案feiyan2 <- subset(mydata, grepl('肺炎', C02N))  #查询门急诊诊断含有肺炎的病案identical(a1, a) #sqldf()和subset()查询一致性判断

另外,也可以使用聚合函数汇总表中的数据,如AVG()、COUNT()、MAX()、MIN()、SUM(),将结果与病案首页系统查询结果比对。

4R语言统计函数与频数表函数的方法核对

数据读入R语言,并查看前6行,具体如下:

library(readxl) #加载reaxl包mydata <- read.csv(file = 'C:/Users/Administrator/Desktop/hqmsts_2019M1-81.csv') #读入首页csv数据head(mydata) #查看前6条患者信息
将数据添加到R的搜索路径,避免频繁使用$符号,如下所示:
attach(mydata)  #将数据添加到R的搜索路径

对于定性类型的字段(变量)使用频数表生成函数table() ,如字段B34C为患者离院方式,当该字段值域=3时,表示医嘱转社区,也是国家提取的重要字段,反映住院患者下转人次,如下所示:

table(B34C) #统计离院方式频数
B34C    1     2     3     4     5     9 74537   319   280  2941   457   217
对于定量类型的字段(变量)可采用summary() 函数,对费用字段进行描述性统计,如D23x01为抗菌药物费用,如下所示:
summary(D23x01) #统计抗菌药物费用
Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     0.00     0.00    70.06   496.72   511.63 56170.94 
对于出院主要诊断主要手术操作病理诊断可以生产频数统计表,如下所示:
write.csv(data.frame(table(C03C)), file = 'zhenduan.csv', row.names = TRUE) #导出出院主要诊断编码频数表write.csv(data.frame(table(C14x01C)), file = 'shoushu.csv', row.names = TRUE) #导出主要手术操作编码频数表write.csv(data.frame(table(C09C)), file = 'bingli.csv', row.names = TRUE) #导出病理诊断编码频数表

△出院主要诊断频数统计表

A08.000 轮状病毒性肠炎为例,首页上传107例,查询院内首页是否为107例,可进行核对。

完整代码:

library(readxl)  #加载reaxl包mydata <- read.csv(file = 'xxx.csv')  #读入首页csv数据head(mydata)  #查看前6条患者信息attach(mydata)  #将数据添加到R的搜索路径table(B34C) #统计离院方式频数summary(D23x01) #统计抗菌药物费用write.csv(data.frame(table(C03C)), file = 'zhenduan.csv', row.names = TRUE)  #导出出院主要诊断编码频数表write.csv(data.frame(table(C14x01C)), file = 'shoushu.csv', row.names = TRUE)  #导出主要手术操作编码频数表write.csv(data.frame(table(C09C)), file = 'bingli.csv', row.names = TRUE)  #导出病理诊断编码频数表mydata <- read.csv(file = 'xxx.csv')  #读入首页csv数据head(mydata) #查看前6行数据library(sqldf) #载入sqldf包sqldf('select * from mydata where A12C = 2 ',  row.names = TRUE)  #查询性别为男的病案sqldf('select * from mydata where A14 between 50 and 80')  #查询年龄在50岁到80岁之间的病案sqldf('select * from mydata where  C02N like '%肺炎%'')  #查询门急诊诊断含有肺炎的病案sqldf('select * from mydata where B17 in ('儿科Ⅲ病区', '肾脏病内科')')  #查询出院病房为儿科III病区和肾脏病内科的病案subset(mydata, A12C == 2) #年龄在50岁到80岁之间的病案subset(mydata, A14 >= 50 & A14 <= 80) #年龄在50岁到80岁之间的病案subset(mydata, grepl('肺炎', C02N)) #门急诊诊断含有肺炎的病案feiyan1 <- sqldf('select * from mydata where  C02N like '%肺炎%'', row.names = TRUE)  #查询门急诊诊断含有肺炎的病案feiyan2 <- subset(mydata, grepl('肺炎', C02N))  #查询门急诊诊断含有肺炎的病案identical(a1, a) #sqldf()和subset()查询一致性判断
(0)

相关推荐