はじめに
OBSERVATION_PERIOD は多くの初心者が見落としがちなテーブルですが、非常に重要です。この表は、「この患者に関するデータはいつから入手できましたか?」 という質問に答えます。
患者に OBSERVATION_PERIOD がない場合、「患者は病気ではない」のか、「患者は病気だが検査に来ていない(したがってデータがない)」のかを区別することができません。
1. OBSERVATION_PERIOD が必要な理由は何ですか?
###1.1. 「不在vs行方不明」の問題
Bệnh nhân Lan:
├── 2020-01-10: Khám → chẩn đoán Tiểu đường
├── 2020-06-15: Tái khám
├── 2021-01-20: Tái khám
├── (im lặng 2 năm)
└── 2023-03-10: Nhập viện → Suy tim
Câu hỏi: Từ 2021-01 đến 2023-03, Lan có khỏe mạnh
hay chuyển sang bệnh viện khác?
OBSERVATION_PERIOD は、患者がデータ ソースを「表示」していた時間を示します。
Observation Period:
┌──────────────────────────────────────────────────────────────┐
│ 2020-01-10 ════════════════════════ 2021-12-31 │
│ (Có BHYT tại BV này) │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ 2023-01-01 ════════════════════════ 2024-06-30 │
│ (Quay lại BV, có BHYT mới) │
└──────────────────────────────────────────────────────────────┘
→ Trong observation period: không có Condition = bệnh nhân KHÔNG bị
→ Ngoài observation period: không có Condition = KHÔNG BIẾT
###1.2.分析への影響
| 分析 | OPなし | はいOP |
|---|---|---|
| 発生率 | 不正確 (分母が不正確) | 正しい (危険な作業時間を把握) |
| 有病率 | 間違っています (カウントが不十分です) | True (総人口がわかっている) |
| 生存分析 | 検閲時間が分からない | イベントまでの正確な時間 |
| コホートエントリー | データの外部から患者を選択できる | OP で BN のみを選択 |
2. テーブル構造
| コラム | タイプ | 必須 | 説明 |
|---|---|---|---|
observation_period_id | 整数 | ✅PK | 固有の ID |
person_id | 整数 | ✅FK | 人物 リファレンス |
observation_period_start_date | 日付 | ✅ | データ開始日 |
observation_period_end_date | 日付 | ✅ | データの終了日 |
period_type_concept_id | 整数 | ✅ | 原点がOPを決定 |
###2.1. period_type_concept_id
| コンセプトID | コンセプト名 | 説明 |
|---|---|---|
| 32817 | EHR | EHR 記録から判断 |
| 32810 | クレーム | 保険金請求/健康保険という言葉を決める |
| 44814724 | 医療現場での出会いをカバーする期間 | 出会いから |
| 44814725 | アルゴリズムによって推定される期間 | 推論アルゴリズム |
3. 観測期間の決定方法
###3.1.請求/保険データから
BHXH cấp thẻ BHYT:
┌─────────────────────────────────────────┐
│ Mã thẻ: DN-123456 Hiệu lực: 01/2020 │
│ BV đăng ký: Chợ Rẫy Hết hạn: 12/2024 │
└─────────────────────────────────────────┘
→ observation_period_start_date = 2020-01-01
→ observation_period_end_date = 2024-12-31
→ period_type_concept_id = 32810 (Claim)
###3.2. EHRデータより
明確な保険情報がない場合は、最初から最後の出会い/訪問までとして数えます。
-- Tính OP từ visits
SELECT
person_id,
MIN(visit_start_date) AS observation_period_start_date,
MAX(COALESCE(visit_end_date, visit_start_date))
AS observation_period_end_date,
32817 AS period_type_concept_id -- EHR
FROM visit_occurrence
GROUP BY person_id;
###3.3.患者は複数の観察期間を持つことができます
Bệnh nhân person_id = 100001:
OP 1: ═══════════ (2018-01-01 → 2019-06-30)
Có BHYT tại BV A
Gap (6 tháng, không có dữ liệu)
OP 2: ═══════════════════ (2020-01-01 → 2024-12-31)
Có BHYT mới tại BV A
→ 2 records trong OBSERVATION_PERIOD
INSERT INTO observation_period VALUES
(1, 100001, '2018-01-01', '2019-06-30', 32810),
(2, 100001, '2020-01-01', '2024-12-31', 32810);
4. 重要なルール
###4.1.すべての臨床事象は観察期間内に発生する必要があります
OP: ════════════════════════════════════
2020-01-01 2024-12-31
✅ Visit 2020-03-15 (trong OP)
✅ Condition 2022-06-10 (trong OP)
❌ Drug Exposure 2019-05-10 (NGOÀI OP!) → Cảnh báo data quality
ACHILLES データ品質チェック: OBSERVATION_PERIOD 以外の臨床イベントがあるかどうかを確認します。
###4.2.観測期間は重複できません
同じ person_id が与えられた場合、OP は 時系列順であり、重複しない必要があります。
✅ ĐÚng:
OP1: ═══════ OP2: ═══════════
2018-01 2019-06 2020-01 2024-12
❌ SAI (overlap):
OP1: ═══════════════
OP2: ═══════════════
###4.3.特別大会
| 状況 | 処理 |
|---|---|
| 患者は一度だけ来た | 開始日 = 終了日 = 試験日 |
| 患者が死亡 | end_date = 死亡日 |
| ギャップ < 32 日 (クレーム) | 通常は 1 つの OP に結合されます。 |
| 多くの情報源が重複しています | 最大の OP に結合 |
5. 分析への応用
###5.1.リスクにさらされる作業時間を計算する
-- Tổng thời gian theo dõi (person-years)
SELECT
SUM(
observation_period_end_date - observation_period_start_date
) / 365.25 AS total_person_years
FROM observation_period;
-- Person-time cho incidence rate
SELECT
p.gender_concept_id,
SUM(
op.observation_period_end_date - op.observation_period_start_date
) / 365.25 AS person_years
FROM observation_period op
JOIN person p ON op.person_id = p.person_id
GROUP BY p.gender_concept_id;
###5.2. 「十分なデータ」で患者をフィルタリングする
-- Chỉ chọn BN có ≥ 1 năm follow-up
SELECT person_id
FROM observation_period
WHERE observation_period_end_date - observation_period_start_date >= 365
GROUP BY person_id;
###5.3.データ品質をチェックする
-- 観測期間外のイベントを検索する
選択
'CONDITION' ASevent_type、
co.person_id、
co.condition_start_date ASevent_date
FROM 条件発生 co
LEFT JOIN 観測期間演算
ON co.person_id = op.person_id
AND co.condition_start_date
op.observation_period_start_date の間
かつ、op.observation_period_end_date
WHERE op.observation_period_id が NULL;
6. 完全な例
-- OBSERVATION_PERIOD (ベトナムの病院の場合)
INSERT INTO 観測期間 (
観測期間ID、
person_id、
観測期間開始日、観測期間開始日
観測期間終了日、観測期間終了日
period_type_concept_id
) 値
-- 患者 100001: 2020 年から 2024 年まで健康保険に加入しています。
(1, 100001, '2020-01-01', '2024-12-31', 32810),
-- 患者 100002: 2023 年に 3 回来院
(2、100002、'2023-02-15'、'2023-11-20'、32817)、
-- 患者 100003: 2 つの異なる段階
(3、100003、'2019-03-10'、'2020-06-30'、32817)、
(4、100003、'2022-01-15'、'2024-06-30'、32817);
概要
- OBSERVATION_PERIOD = 患者がシステムに「データを保持している」時間
- 「病気ではない」 と 「データなし」 を区別する
- 全員に必須 — 1 人あたり少なくとも 1 つの OP が必要です
- 同じ person_id を持つ OP 間で 重複なし
- すべての臨床イベントは OP に含まれている必要があります
- 主な用途: 人時間、罹患率、有病率、コホート定義を計算します。
次の記事: VISIT_OCCURRENCE と VISIT_DETAIL — OMOP CDM が医療システムとの各患者の接触を記録する方法。