六大 EHR 数据库核心特征描述

第一部分 六大 EHR 数据库核心特征描述
一、MIMIC4:全球重症研究 “黄金标杆”
核心定位:麻省理工学院主导的公开重症医学数据库,聚焦 ICU 患者全周期诊疗数据,是重症领域科研与 AI 模型开发的首选数据集。
数据概况:最新 3.0 版本覆盖 2008-2022 年数据,含 54.6 万住院人次(其中 9.4 万 + ICU 患者),分钟级生命体征监测(如心率、血压),配套电子病历、实验室检查、影像报告等多维度数据,特护单(chartevents)数据量较旧版激增 50%。
特色与应用:支持 SQL/Python 直接查询,标准化数据结构适配脓毒症预测、多器官功能障碍机制研究等场景,是重症领域 SCI 论文高频引用数据库。
二、AmsterdamUMCdb v1.0.2:欧洲合规重症数据典范
核心定位:荷兰阿姆斯特丹大学医学中心牵头,符合欧盟 GDPR 标准的重症监护数据库,聚焦欧洲人群疾病特征与诊疗实践。
数据概况:收录 2003-2016 年 2 家中心超 2 万例患者数据,含近 10 亿条观察记录,覆盖 712 项生理变量(如脓毒症休克血流动力学参数)、诊断测试及治疗方案,支持多模态数据(电子病历 + 实时监护数据)整合。
特色与应用:采用 PostgreSQL 架构,兼容 MIMIC 系列数据协议,适合跨国多中心研究、AI 模型泛化验证(如机械通气策略优化),为欧洲医疗数据合规使用提供范本。
三、HiRID:高分辨率重症时序数据标杆
核心定位:瑞士伯尔尼大学医院与苏黎世联邦理工学院联合开发,突破传统数据库时间精度限制的重症数据集。
数据概况:覆盖 2008-2016 年 3.3 万例成年 ICU 患者,每 2 分钟采集 712 项生理参数(心率、血氧等),波形数据分辨率达 60-500Hz,含创伤、术后监护、急性呼吸窘迫综合征(ARDS)等复杂病例。
特色与应用:提供 PhysioNet 接口与 Python 示例代码,适配实时生理预测场景(如脓毒症早期预警、液体复苏效果评估),是验证时序 AI 模型鲁棒性的理想数据集。
四、eICU:全球最大急诊重症协作数据库
核心定位:美国重症医学会主导,覆盖多中心急诊重症(EICU)救治场景的协作型数据库。
数据概况:收录 2014-2015 年美国 208 家医院超 20 万例急诊危重症患者数据,涵盖呼吸衰竭(需通气支持)、感染性休克、心搏骤停复苏后等 11 类核心适应症,含床旁超声、血液净化等关键救治记录。
特色与应用:多中心设计降低单中心偏倚,支持急诊脓毒症 3 小时集束化治疗效果评估、ECMO 患者预后预测,在突发公共卫生事件(如新冠重症救治)中可提供大规模数据支撑。
五、All of Us Research Program:全民健康精准医疗支柱
核心定位:美国国立卫生研究院(NIH)主导的百万级全民健康研究计划,聚焦 “精准医疗公平化”,覆盖多样人群健康全周期数据。
数据概况:截至 2025 年纳入超 90 万参与者(含不同种族、地域、社会经济背景),采集基因组数据(如 SNP 位点)、电子健康记录、生活方式(如饮食、运动)、环境暴露(如空气污染)等多维度信息,支持纵向健康轨迹追踪。
特色与应用:适配疾病遗传易感性分析(如非洲人群 2 型糖尿病风险变异)、环境 - 基因交互作用研究,为慢性病预防、个体化诊疗方案制定提供全生命周期数据支持。
六、EHRSHOT:医疗 AI 少样本学习基准平台
核心定位:斯坦福大学开发的首个电子健康记录(EHR)少样本评估基准,解决普通病房 “小数据” 场景下 AI 模型适配难题。
数据概况:含 6739 例患者的纵向数据(4160 万临床事件),设计 15 项预测任务(如 30 天再入院、ICU 转运、胰腺癌诊断),配套 CLMBR-T 预训练模型(1.41 亿参数),支持结构化数据高效处理。
特色与应用:提供标准化少样本学习评估流程,降低医疗 AI 落地门槛,适配普通病房(非 ICU)场景的模型验证,推动 “小数据大模型” 在真实医疗场景中的应用。
第二部分 六大 EHR 数据库 FEMR 包实操代码
一、环境配置(通用)

安装FEMR及数据库适配依赖(含PostgreSQL、PhysioNet连接工具)

!pip install femr psycopg2-binary pandas numpy matplotlib physionet-client --upgrade

导入核心库

import femr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from psycopg2 import connect
from physionet_client import PhysioNetClient
from femr.preprocessing import resample_time_series, fill_missing_values
from femr.features import extract_vital_signs, extract_diagnoses, encode_categorical

二、分数据库代码实现

  1. MIMIC4(SQL 接口适配)

1.1 连接MIMIC4 PostgreSQL数据库(需提前通过PhysioNet申请权限)

def connect_mimic4(db_name=“mimic4”, user=“your_physionet_user”, password=“your_db_pwd”, host=“localhost”):
“”“创建MIMIC4数据库连接,返回连接对象”“”
try:
conn = connect(dbname=db_name, user=user, password=password, host=host, port=5432)
print(“MIMIC4数据库连接成功”)
return conn
except Exception as e:
print(f"连接失败:{str(e)}")
return None

1.2 加载ICU患者生命体征数据(分钟级)

conn = connect_mimic4()
if conn:
mimic_sql = “”"
SELECT subject_id, stay_id, charttime, heart_rate, mean_arterial_pressure, spo2
FROM mimic4_derived.vitalsign
WHERE stay_id IN (SELECT stay_id FROM mimic4_derived.icustay_detail WHERE stay_type = ‘ICU’)
LIMIT 20000; # 按需调整数据量,避免内存溢出
“”"
mimic_data = pd.read_sql(mimic_sql, conn)
conn.close() # 关闭连接,释放资源

1.3 FEMR时序预处理(匹配MIMIC4分钟级分辨率)

mimic_data[“charttime”] = pd.to_datetime(mimic_data[“charttime”]) # 转换时间格式

1分钟重采样(聚合均值)

mimic_processed = resample_time_series(
data=mimic_data,
id_col=“stay_id”, # 患者ICU停留ID(唯一标识)
time_col=“charttime”,
freq=“1min”,
agg_func=“mean”
)

线性插值补全缺失值(重症数据常用策略)

mimic_processed = fill_missing_values(mimic_processed, method=“linear”)
print(f"MIMIC4预处理后数据形状:{mimic_processed.shape}")

  1. AmsterdamUMCdb v1.0.2(PostgreSQL 合规适配)

2.1 连接AmsterdamUMCdb数据库

def connect_amsterdam(db_name=“amsterdam_umc_db”, user=“your_db_user”, password=“your_pwd”, host=“localhost”):
“”“创建AmsterdamUMCdb连接,兼容PostgreSQL架构”“”
conn = connect(dbname=db_name, user=user, password=password, host=host, port=5432)
return conn

2.2 加载脓毒症休克患者血流动力学数据

conn = connect_amsterdam()
if conn:
ams_sql = “”"
SELECT patientid, admissionid, datetime, heart_rate, mean_arterial_pressure, cardiac_output
FROM public.physiological_data
WHERE admissionid IN (SELECT admissionid FROM public.diagnoses WHERE diagnosis_code LIKE ‘A41%’) # ICD-10脓毒症编码
LIMIT 15000;
“”"
ams_data = pd.read_sql(ams_sql, conn)
conn.close()

2.3 FEMR多模态数据预处理(适配欧洲数据格式)

ams_data[“datetime”] = pd.to_datetime(ams_data[“datetime”])

5分钟重采样(匹配AmsterdamUMCdb数据密度)

ams_processed = resample_time_series(
data=ams_data,
id_col=“admissionid”,
time_col=“datetime”,
freq=“5min”,
agg_func=“median” # 中位数抗异常值
)
print(f"AmsterdamUMCdb预处理后数据形状:{ams_processed.shape}")

  1. HiRID(高分辨率数据适配)

3.1 下载HiRID数据(需PhysioNet token,申请地址:https://physionet.org/)

def download_hirid(token=“your_physionet_token”, save_dir=“./hirid_data”):
“”“从PhysioNet下载HiRID数据集”“”
client = PhysioNetClient(token)
client.download_dataset(dataset_id=“hirid/1.1.1”, target_dir=save_dir)
print(f"HiRID数据已保存至:{save_dir}")

download_hirid(token=“your_actual_token”)

3.2 FEMR加载高分辨率波形数据(60-500Hz)

hirid_loader = femr.loaders.HiRIDLoader(data_dir=“./hirid_data”)

提取2分钟窗口统计特征(高分辨率数据需多维度聚合)

hirid_data = hirid_loader.load_patients(
patient_ids=range(1, 101), # 选择前100名患者(避免内存压力)
time_window=“2min”, # 匹配HiRID采集频率
features=[“heart_rate”, “systolic_bp”, “diastolic_bp”, “respiratory_rate”],
agg_funcs=[“mean”, “std”, “max”, “min”] # 统计量覆盖趋势与波动
)
print(f"HiRID加载数据形状:{hirid_data.shape}")

  1. eICU(急诊重症多中心数据适配)

4.1 下载eICU数据(需PhysioNet认证)

client = PhysioNetClient(“your_physionet_token”)
client.download_dataset(“eicu-crd/2.0”, target_dir=“./eicu_data”)

4.2 FEMR加载急诊重症数据(聚焦呼吸衰竭患者)

eicu_loader = femr.loaders.EICULoader(data_dir=“./eicu_data”)
eicu_data = eicu_loader.load_patients(
patient_ids=range(500), # 按需调整患者数量
filter_condition=“diagnosis LIKE ‘%respiratory failure%’”, # 筛选呼吸衰竭患者
features=[“heart_rate”, “spo2”, “ventilation_mode”, “arterial_ph”],
time_window=“5min” # 急诊数据常用5分钟粒度
)

4.3 预处理:编码通气模式(分类变量)

eicu_data = encode_categorical(
data=eicu_data,
cols=[“ventilation_mode”],
encoding_type=“onehot” # 独热编码适配模型输入
)
print(f"eICU预处理后数据形状:{eicu_data.shape}")

  1. All of Us(多维度数据整合)

5.1 加载All of Us临床+基因组数据(需NIH数据访问授权)

all_of_us_loader = femr.loaders.AllOfUsLoader(
clinical_path=“./all_of_us/clinical_records.csv”, # 临床数据路径
genomic_path=“./all_of_us/genomic_variants.vcf” # 基因组VCF文件路径
)

5.2 整合多模态特征(临床+基因组)

all_of_us_data = all_of_us_loader.merge_modalities(
id_col=“participant_id”, # 参与者唯一ID
clinical_features=[“age”, “bmi”, “diabetes_status”, “hypertension_status”], # 临床特征
genomic_features=[“rs2237892”, “rs10811661”] # 示例SNP位点(与代谢疾病相关)
)

5.3 种族多样性特征编码(适配All of Us人群多样性)

all_of_us_data = encode_categorical(
data=all_of_us_data,
cols=[“race_ethnicity”],
encoding_type=“label” # 标签编码适合类别较多的种族变量
)
print(f"All of Us整合后数据形状:{all_of_us_data.shape}")

  1. EHRSHOT(少样本任务适配)

6.1 下载EHRSHOT数据集(需斯坦福大学授权或PhysioNet获取)

client = PhysioNetClient(“your_physionet_token”)
client.download_dataset(“ehrshot/1.0”, target_dir=“./ehrshot_data”)

6.2 加载30天再入院预测任务(少样本场景:仅10例样本)

ehrshot_loader = femr.loaders.EHRSHOTLoader(data_dir=“./ehrshot_data”)
task_data = ehrshot_loader.load_task(
task_name=“30day_readmission”, # 任务名称(可选:icu_transfer、pancreatic_cancer等)
sample_size=10 # 少样本核心参数,支持1-50例
)

6.3 FEMR少样本特征工程(适配CLMBR-T模型)

提取入院前72小时生命体征

task_features = extract_vital_signs(
data=task_data,
time_window=“72h”,
agg_funcs=[“mean”, “last”] # 均值+末次值覆盖趋势与即时状态
)

提取ICD-10诊断编码

task_features = extract_diagnoses(task_features, icd_code_type=“ICD10”)

6.4 生成CLMBR-T模型输入格式

model_input = femr.models.prepare_clmbr_input(
data=task_features,
id_col=“patient_id”,
time_col=“admission_time”,
label_col=“readmission_label” # 预测标签列
)
print(f"EHRSHOT模型输入形状:{model_input.shape}")

三、通用分析工具(适配所有数据库)
def plot_vital_trend(data, patient_id, vital_col=“heart_rate”, id_col=“stay_id”, time_col=“charttime”):
“”“绘制单个患者的生命体征趋势图”“”
patient_data = data[data[id_col] == patient_id].sort_values(time_col)
plt.figure(figsize=(12, 4))
plt.plot(patient_data[time_col], patient_data[vital_col], color=“#2E86AB”)
plt.title(f"Patient {patient_id} {vital_col} Trend", fontsize=14)
plt.xlabel(“Time”, fontsize=12)
plt.ylabel(vital_col, fontsize=12)
plt.grid(alpha=0.3)
plt.show()

def calculate_data_quality(data, id_col=“patient_id”, time_col=“charttime”):
“”“计算数据质量指标:患者数、缺失率、时间覆盖度”“”
data[“time_diff”] = data.groupby(id_col)[time_col].diff().dt.total_seconds() / 3600 # 小时级时间差
quality = {
“total_patients”: data[id_col].nunique(),
“avg_missing_rate”: round(data.isnull().mean().mean() * 100, 2), # 平均缺失率(%)
“avg_time_coverage”: round(data.groupby(id_col)[time_col].apply(
lambda x: (x.max() - x.min()).total_seconds() / 3600
).mean(), 2) # 平均时间覆盖度(小时)
}
return pd.DataFrame(quality, index=[0])

示例:分析MIMIC4数据质量+绘制患者趋势

quality_report = calculate_data_quality(mimic_processed, id_col=“stay_id”, time_col=“charttime”)
print(“MIMIC4数据质量报告:”)
print(quality_report)
plot_vital_trend(mimic_processed, patient_id=10001, vital_col=“heart_rate”)

四、关键使用说明
权限申请:
MIMIC4/HiRID/eICU/EHRSHOT 需通过 PhysioNet 申请(https://physionet.org/),All of Us 需 NIH 数据授权(https://allofus.nih.gov/),AmsterdamUMCdb 需阿姆斯特丹大学医学中心合规审核。
参数调整:
时序重采样频率(freq):MIMIC4 用1min、HiRID 用2min、eICU 用5min;
样本量(LIMIT/patient_ids):初次测试建议≤2 万条数据,避免内存溢出。
数据安全:
所有数据需去标识化处理,禁止存储患者姓名、身份证号等隐私信息,合规遵循 GDPR/HIPAA 等法规。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值