RWD 分析を R で

>100 Views

April 06, 26

スライド概要

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

1 RWD 分析を で 西川 寛来 2026-04-08 R with Pharma Lab#1 R

2.

スライドはこちら 2 https://nissinbo.github.io/RwPL_1_rwd/ R with Pharma Lab#1

3.

自己紹介 3 西川寛来 → 製薬業界で修行中 → LinkedIn → GitHub R with Pharma Lab#1

4.

こんな話をします 🙆 4 分析におけるデータハンドリングの tips データベース研究で便利なパッケージ OMOP CDM の紹介 RWD R with Pharma Lab#1

5.

RWD 分析の大変なところ 🤔 製薬企業でよく利用される RWD 医療情報データベース → レセプトデータ → 電子カルテデータ 解析上の難しい点・勘所 大規模データのハンドリング 治療の連続性 (処方継続、中止、切り替え) の追跡 ICD-10 等のコード体系 R with Pharma Lab#1 5

6.

結論 これで学ぼう 6 : 疫学のための R ハンドブック → 疫学データ解析の実践ガイド → 可視化・統計・レポーティングなど幅広くカバー これが最速だと思います。が、本発表ではもっとマニアックな tips をお伝えします R with Pharma Lab#1

7.

7 基本的な操作 R with Pharma Lab#1

8.

非等価結合 8 🔗 RWD 研究で頻出のシチュエーションで便利 → 処方日より前の直近の検査値を取得したい → 診断日から n 日以内の入院を探したい 1 2 3 4 5 6 7 8 9 10 11 12 13 (Non-equi joins) # 処方テーブル rx <- tibble(patient_id = c(1, 1, 2), rx_date = as.Date(c("2023-01-15", "2023-06-01", "2023-03-10"))) # 検査値テーブル lab <- tibble( patient_id = c(1, 1, 1, 2), lab_date = as.Date(c("2022-12-01", "2023-01-10", "2023-05-20", "2023-02-15")), hba1c = c(7.2, 7.5, 6.8, 8.1) ) # 処方日以前の直近の検査値を非等価結合で取得 result <- rx |> left_join(lab, join_by(patient_id, closest(rx_date >= lab_date))) left_join() 1 行で完結! 1 → filter() → arrange() → slice_head() と同様の処理が、join_by() R with Pharma Lab#1

9.

治療継続性 e.g., 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 (Persistency) の定義 💉 9 「治療が 15 日以上途切れたら中断とみなす」みたいなルールを定義したい rx <- tribble( ~patient_id, ~start_date, ~end_date, 1, "2024-01-01", "2024-04-01", 1, "2024-01-15", "2024-02-01", 1, "2024-02-15", "2024-03-01" ) |> mutate(start_date = as.Date(start_date), end_date = as.Date(end_date)) # 各処方を lubridate の interval 形式に変換 rx_intervals <- rx |> arrange(patient_id, start_date) |> group_by(patient_id) |> mutate( rx_interval = interval(start_date, end_date), running_max_end = accumulate(end_date, max), prev_coverage = lag(interval(first(start_date), running_max_end)) ) R with Pharma Lab#1 1 2

10.

単純な lead/lag の比較だと ❌ lead/lag の比較 処方1 処方2 処方3 |===========1/1〜4/1===========| |=1/15〜2/1=| |=2/15〜3/1=| ↑ 処方2と処方3の間の gap で 誤って「中断」と判定 10 …? ✅ “最遅終了日”を更新するやり方 処方1 処方2 処方3 |===========1/1〜4/1===========| ↓ running_max_end = 4/1 |=1/15〜2/1=| → 4/1以前: 継続✅ |=2/15〜3/1=| → 4/1以前: 継続✅ 治療の連続性の判定には、lead()/lag() だとダメなことがある! accumulate(end_date, max) とすると確実 R with Pharma Lab#1

11.

11 大規模データへの対応 R with Pharma Lab#1

12.

あなたのデータ環境は? が用意されている → SQL で抽出すれば OK → SQL または dbplyr DB がない / R 上で大きなデータを扱う → DuckDB → duckplyr DB R with Pharma Lab#1 12

13.
[beta]
DB
1
2
3
4
5

があるなら

: SQL,

library(DBI)
library(dplyr)
library(dbplyr)

con <- dbConnect(RPostgres::Postgres(), ...)

SQL
1
2
3
4
5
6
7
8
9

dbplyr

sql <- "
SELECT patient_id, drug, COUNT(*) AS n_rx
FROM rx
WHERE start_date >= DATE '2023-01-01'
AND start_date < DATE '2024-01-01'
GROUP BY patient_id, drug
"
n_rx <- dbGetQuery(con, sql)

どちらも

OK

# DB接続

dbplyr
1 n_rx <- con |>
2
tbl("rx") |>
3
filter(
4
between(
5
start_date,
6
as.Date("2023-01-01"),
7
as.Date("2024-01-01")
8
)
9
) |>
10
count(patient_id, drug) |>
11
collect() # ここで初めて R に持ってくる

R with Pharma Lab#1

13

14.

それでも「 上で大きなデータ」を扱いたい場面がある R ウチには DB なんてないよ! CSV ファイルでしかデータもらえないよ! DB はあるけど、権限の都合で DB 上に一時テーブルが作れない そんな時には duckplyr R with Pharma Lab#1 14

15.

duckplyr のうれしさ 15 を準備しなくても、R 上で大規模データを扱える 速い dplyr 記法で書ける DB 1 library(duckplyr) 2 3 penguins_duck <- penguins |> 4 as_duckdb_tibble() |> # duckplyr data frame に変換 5 group_by(species) |> # 普通に dplyr を書くだけ 6 summarise(mean_bill_length = mean(bill_len, na.rm = TRUE)) R with Pharma Lab#1

16.

dplyr Code と duckplyr の速度比較 速いです R with Pharma Lab#1 16

17.

17 フローチャート作成 R with Pharma Lab#1

18.

CONSORT diagram とは 臨床研究において患者選択や割り当ての流れを示したフローチャート 集団選択が複雑な RWD 研究ではとても重要! R with Pharma Lab#1 18

19.

よくある 🤔 CONSORT diagram の作り方 コピペ、体裁を整える作業で消耗するほど人生は長くない データと紐付けて、患者数を自動で入れたい。どうせ明日には除外基準が 1 つ追加されて、患者数も変わるんだし… 図はすべて ggplot2 で書きたい R with Pharma Lab#1 19

20.

CONSORT diagram を作るための パッケージ R flowchart → “Tidy Flowchart Generator” → dplyr っぽく piping してフローチャートを作成 R with Pharma Lab#1 20

21.

flowchart の使い方 21 1 safo |> 2 as_fc(label = "Patients assessed for eligibility") |> 3 fc_filter(!is.na(group), label = "Randomized", show_exc = TRUE) |> 4 fc_split(group) |> 5 fc_filter(itt == "Yes", label = "Included in ITT") |> 6 fc_draw() 患者集団やコードセットに変更があっても、患者数のコピペは不要! R with Pharma Lab#1 1 2 3 4

22.

22 まとめ R with Pharma Lab#1

23.

RWD 分析を でやっていきましょう R 📦 基本的な操作 を使った非等価結合は便利 治療継続性は lubridate の interval と accumulate() を組み合わせると確実 join_by() 🚀 大規模データ があるなら SQL / dbplyr ローカル の R でも duckplyr を使うだけで高速化! DB 🗂 フローチャート作成 全部 R でやって、コピペ作業から解放 R with Pharma Lab#1 23

24.

24 Enjoy 🙋 R with Pharma Lab#1