霞と側杖を食らう

ほしいものです。なにかいただけるとしあわせです。[https://www.amazon.jp/hz/wishlist/ls/2EIEFTV4IKSIJ?ref_=wl_share]

『公衆衛生の倫理学 ─国家は健康にどこまで介入すべきか』の学習記録

【学習動機】

昔、経済学を学んでいた頃、メカニズムデザインや行動経済学で、人の行動をより良い方向へ導いていく仕組みが考えられるのは、素晴らしいものだと思っていた。所与の損失関数や利得関数を最小化したり最大化したりする方法を考えることが重要だと思っていた。しかし、経済学とは別の分野を学んだりしているうちに、「良い方向」とは何なのか、損失や利得を決める価値とは何なのかをもう少し考えるべきだったと思うようになった。さらに、このコロナ禍で、人々の価値観の相違の存在が目立つようになったこともあり、「良さ」や「正しさ」への関心が高まった。

そんなときに玉手『公衆衛生の倫理学 ─国家は健康にどこまで介入すべきか』という本に出会ったので、これを読んでみることにした。

www.chikumashobo.co.jp

以下、簡単な読書メモを記録しておく。

 

【学習内容】

各章、読んだ内容をざっくりまとめておく。

● 第1章 肥満対策の倫理的な課題

肥満対策を例にとって、公衆衛生の倫理的な課題を説明している。

1. 行き過ぎたパターナリズム

本人の意図と関係なく、健康を強制し、不当な介入をしてしまう問題

2. 健康の道具化

健康増進政策が、当人の健康を第一義とせずに、医療費抑制などの別の目的のために政治利用されてしまう問題

3. 自己責任論

健康を持ち上げ、不健康を下げることで、必要以上に過剰に自己責任を追及してしまう問題

4. スティグマ

不健康になってしまった人が差別的な扱いを受ける事態になってしまう問題

● 第2章 健康の社会経済的な格差の倫理

まず、そもそも健康格差が不当で、是正すべきなのかということを確認している。不当性を強める条件として、1. 深刻さ、2. 当人の選択の有無、3. 是正の可能性、4. 派生する影響の有無、5. 他の価値との比較 の5つを提示して確認している。

次に、不当性があるとして、是正の手段を検討している。従来的な、自発的努力を求める方法は、1. 非効率 2. 不平等の増大 3. 差別の助長 の3つの問題を挙げている。一方で、直接的に生活に介入するアプローチは個人の自律を尊重していないという点で問題である。ここにジレンマが存在し、自律の尊重と健康格差の是正に対する価値観が問われることになる。

● 第3章 健康増進のためのナッジの倫理

人々の自律をある程度尊重しつつ、有効な介入を与えるものとして、健康増進政策においても注目されているのがナッジである。ナッジはリバタリアンパターナリズムの立場から正当化される。しかし、ナッジは介入の有効性に加えて、低コストであるということも魅力的であり、リバタリアンパターナリズムの正当化の範囲を超えた目的で使用されることがあるので、どのような目的で設計されているか精査することが必要である。

● 第4章 健康をめぐる自己責任論の倫理

不健康に陥ったことを自己責任によるものだとしてしまうことは、不健康の支援が避けられてしまうことや、不当な道徳的非難につながってしまう。健康は社会的決定要因で決まるもので、コントロールが難しいものだとして自己責任論を批判すると、1. 自己責任論がコントロール可能性に依拠していないことがある点、2. コントロールが難しいとするならば個人の主体性の尊重に失敗してしまう点 の2点において、筋が悪い。そのため、提示されているのが、責任を「前向き責任」と「後ろ向き責任」に区別することである。前向き責任は将来の行為に関わる責任で、後ろ向き責任は過去の行為に関わる責任である。この区別によって、自己責任論は後ろ向き責任に基づくものとして批判しつつ、前向き責任で以て個人の主体的行動をサポートしていくことができる。

● 第5章 パンデミック対策の倫理

新型コロナのパンデミックへの対策を経験する中で、公衆衛生政策が個人の自由と対立するものであるという見方が広がったが、アマルティア・センのケイパビリティ・アプローチに依拠すれば、別の見方ができる。ケイパビリティ・アプローチは「機能(functioning)」と「ケイパビリティ(capability)」から構成される。機能は、人がある状態であることや、ある行為をすることができることとして定式化される。ケイパビリティは、機能の組み合わせで定式化され、その人がどのような生活を送ることができるという意味での自由の大きさを意味する。このアプローチに基づけば、感染症対策としての行動制限は、自由を奪うものというよりは、感染リスクを回避できるという意味での自由を守っていると見なすことができる。公衆衛生政策においては、多様性のある自由の中で、どの自由に価値を置いて、どれを優先するのか重要になってくる。

● 終章 自由としての公衆衛生へ

テーマとして扱われなかったが、公衆衛生政策の重要な論点として、1. 健康という概念について、2. 生権力の観点、3. ジェンダーの観点、4. グローバリゼーションの観点 の四つを紹介している。

最後に、アマルティア・センのDevelopment as Freedom(自由としての開発)を取り上げている。センは、自由を目標として据えた「自由のための開発」を目指しているが、それだけでなく同時にまた自由を手段とみなす「自由を通じた開発」をも目指している。この二重性を表現するために、「自由としての開発」と述べていると考えられる。筆者は、公衆衛生についても同様で、自由としての公衆衛生であると同時に、自由を通じた公衆衛生であるべきであり、「自由としての公衆衛生」を目標として掲げている。

【学習予定】

全体として、なんとなく自分の頭の中で考えてはいたが全くまとまっていなかった議論を整理できて良かった。倫理学への読書案内も分かりやすく書かれていて、とてもありがたい。参考にして倫理学も学んでいきたいところ。

まずは、ケイパビリティ・アプローチについて書かれていた、アマルティア・センの『福祉の経済学』は途中まで読んでどこかに積読してしまっているので、探し出して読み切りたい。

www.iwanami.co.jp

Rでメモリに乗らないデータを分割して読み込んで処理する方法の学習記録

【学習動機】

Rでメモリに乗らないような大規模データを読み込んで処理するとき, どうすべきかで悩んだ. 昔, 福島『Rによるハイパフォーマンスコンピューティング』

www.amazon.co.jp

は読んだが, 今の状況と違うかもしれない. 最新のプラクティス版が出たら嬉しいところだが, そういう議論が少ないのはメモリを買って解決しているところが多くて需要が減っているからだろうか.

さて, {ff}パッケージと{ffbase}パッケージ, {bigmemory}パッケージなどあるかもしれないが, 少し扱いにくい.

最初の段階ではデータ全体を使わなくてもよくて, メモリに乗るサイズに分割して, それぞれ繰り返し処理してしまえば良いというケースであれば, 全てをメモリに乗せる必要はない. 分割して読み込む方法を考える. 

分割して読み込む方法は以下の記事に書いてあった. 

メモリに乗らないデータを読み込むパッケージの備忘録 - 盆栽日記

メモリに乗らないデータを分割して読み込んでくれるパッケージ - 盆栽日記

しかし, ここに書かれている{readr}パッケージのread_csv_chunked関数で引数chunk_sizeの指定では上からchunk_sizeずつ読み込む仕組みになっている. データのどこで切れてもいいのなら問題ないが, 個票データなどでkeyとなるIDなどがあって, 同じIDのデータが分割されたデータに別々引き離されてしまうのは困るということがありうる. そんな場合にどうすればいいのかと思いあぐねていたら, DataFrameCallback$new()を使うと上手くできそうな気がしたので, コードを書いて実験してみた. 

【学習内容】

データを生成してcsvに書き込み, それを分割して読んでいく.

パッケージ読み込みと乱数固定.

library(tidyverse)
set.seed(2023)

データの生成

まずは実験するために, データを生成.
100万人(コード上では記事の出力のため1000人で回している)のデータを作る. idを1~100万でふる.

# data generation
N <- 1000    # 速度のためにここでは1000人にする
#N <- 1000000
id_unique <- 1:N

100万人がそれぞれ1~10個のcostデータを持つことにする. costは適当に0~10000の値を取る. できたデータセットcsvに書き込む(この時点でメモリに乗っているので, 今回のケースは工夫する必要はないのだが)

N_ids <- sample(x = 1:10, size = N, replace = TRUE)
ids <- rep(id_unique, N_ids)

df <- 
  data.frame(
    id = ids
  )
Ndata <- nrow(df)

df <- df %>% 
  mutate(
    cost = floor(runif(n = Ndata, min = 0, max = 10000))
  )

write.csv(df, file = "df.csv", row.names=FALSE)

データの分割読み込み

書き込んだcsvで今回の本題に入る.

ataFrameCallback$new()を使い方の実験として, idが1~10で読んでみる.

# idを1~10で読む実験
idmin <- 1
idmax <- 10
f_subset_id <- function(x, idmin, idamax) subset(x, idmin <= id & id <= idmax)

df_r_1 <- read_csv_chunked("df.csv", DataFrameCallback$new(f_subset_id))
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   id = col_double(),
##   cost = col_double()
## )
df_r_1
## # A tibble: 41 × 2
##       id  cost
##    <dbl> <dbl>
##  1     1  8482
##  2     1  3566
##  3     1   448
##  4     1  6724
##  5     1  9164
##  6     2  1288
##  7     2  2621
##  8     2  2820
##  9     2  2908
## 10     2  8297
## # … with 31 more rows

こんな感じで繰り返せば上手くできそう.

1分割内のid数と分割数を決めて, 繰り返しで処理.

N_sep_id <- 10    # 1分割内のid数
N_sub <- N/N_sep_id    # 分割数
for(i in 1:N_sub){
  dfname <- paste("df_r", i, sep = "_")
  idmin <- (i-1)*N_sep_id+1
  idmax <- i*N_sep_id
  # 読み込んでそれぞれデータフレームとして保存
  # read_csv_chunked("df.csv", DataFrameCallback$new(f_subset_id))に
  # 関数をかませて処理して小さくしてから保存すればよい
  # 今回は各idでcostの和を出すことにする.
  assign(dfname, 
         read_csv_chunked("df.csv", DataFrameCallback$new(f_subset_id)) %>% 
           group_by(id) %>% summarise(sum_cost=sum(cost))
         )
  # 必要ならばremoveなど使ってメモリを解放させながら回す
}

1~10の和が出ているか確認.

df_r_1
## # A tibble: 10 × 2
##       id sum_cost
##    <dbl>    <dbl>
##  1     1    28384
##  2     2    30784
##  3     3    48126
##  4     4    13931
##  5     5    36720
##  6     6     9083
##  7     7     7054
##  8     8     7566
##  9     9      705
## 10    10     8520

今回のidは数値が上手く並んでいたし, そのことを前もって知っていたが, idがどういう範囲にあるか分からない場合は以下のようにして工夫すれば良さそう.

# idがどういう範囲にあるか分からない場合

df_id <- read_csv("df.csv", col_select = c("id"))
# などとして, idの列のみ読み込んで, 自然数の値と対応させるようにすれば良さそう.
# また, このidの列から, データのサイズやメモリの量とを考えて, N_sep_idなどを決めると良さそう

【学習予定】

今回書いたコードは対処療法的なものである. 普段の書き方をして, 時間かマシンパワーを使って, なんとかできるというという点が良さそうであるが, ベストな方法でない可能性が多分にある. 新しくてクールな方法はいくらでもあると思う(別の何かに繋いでやるとかそういうやつ). ここ4,5年, 最近のRのトピックをあまり追えていないので, もう少し追いたいところではある.

【追記 : 2023/06/18】

duckdbやarrowというものが使えるかもしれないらしい. ここ数年で名前は見かけたことはあるが, 追いかけてないのでネットの海に転がっている資料を眺めたりしようと思う. 

【追記終 : 2023/06/18】

 

Matching Adjusted Indirect Comparison (MAIC)の学習記録

【学習動機】

Matching Adjusted Indirect Comparison (MAIC)という比較の手法があることを知った. 直接比較されていない薬剤の効果を間接的に比較したい場合, よく知られているのはネットワークメタアナリシス(Network Meta-analysis : NMA)だと思われる. NMAは, 関心のある薬剤と関連する比較研究を集めて, 公表されている集団レベルのデータ(Aggregate Data : AgD)を繋ぎ合わせて間接比較する. ただし, 普通のNMAでは, 研究間に効果修飾因子の異質性がある場合, バイアスを生んでしまう. もしも, 関心のある薬剤の研究で, 個人レベルのデータ(Individual Patient Data : IPD)があるならば, その問題を解決手法がある. その間接比較は, Population-adjusted indirect comparisonsと呼ばれ, その中には, Matching Adjusted Indirect Comparison (MAIC)というものと, Simulated Treatment Comparison (STC)というものがある. 今回は前者のMAICについて学ぶ必要があったので, MAICが具体的にどういう処理をしているのか、それは何を意図しているのかを理解するため, NICE(The National Institute for Health and Care Excellence)のTSD(Technical Support Documents)の18のAppendixのシミュレーションと, MAICの元論文のSignorovitch et al. (2010)を参考に学習していく.

【学習記録】

MAICの説明

薬剤Aと薬剤BのRCT(AB試験)と薬剤Aと薬剤CのRCT(AC試験)の結果があって, BとCの効果の違いを求めたい場合, Aを軸にBとCを間接的に比較することが考えられる. このときAはBとCを繋いでおり, アンカー(anchor)であると言う. 「AとBの効果の差」と「AとCの効果の差」で単純に差分を取ると, 効果修飾因子がAB試験とAC試験で分布が異なる場合, バイアスが生じてしまう(効果修飾については昔作成したスライドのフェアな比較を崩すもの ~交絡と効果修飾~ / Confounding EffectModification - Speaker Deckが参考になるかもしれない). このとき, AB試験の個々の患者データがある場合, AC試験側の効果修飾因子の分布になるように, AB試験の個々のデータをうまいこと重み付けすることで, AC試験側の集団を疑似的に再現して, 比較することができる. これがMAICの発想である. 

このような状況は実際に起きうる話である.  薬剤Bと薬剤Cの効果の差を示したい薬剤Bのメーカーが, BとCのRCTは実施していないけれど, 薬剤Aと薬剤Bを比較したAB試験については自社のデータとして持っていて, AC試験については論文の公表値で入手できる状況で, AB試験とAC試験では効果修飾因子となる患者背景が異なると考えられる場合, MAIC(もしくはSTC)の使いどころというわけである. ちなみに, AB試験とAC試験でAがアンカーになる場合を例に説明したが, アンカーがないケースでもMAICはできる. ただし, 必要な仮定が厳しくなる. アンカーがないケースは今回は考えないことにする.

以下で, NICEのTSD18のAppendix Dのシミュレーションのコードを使いながら, どういうことをしているか確認していく. 

シミュレーションモデルの説明

TSD18のAppendix DはAnchoredの研究のケースを想定したシミュレーションをしてMAICをしている. このシミュレーションモデルについて説明する. AB試験とAC試験の比較をするものとし. AB試験は薬剤Aと薬剤BのRCT試験, AC試験は薬剤Aと薬剤CのRCT試験に相当するものとする. AB試験はIPD(個人レベルのデータ)があり, AC試験はAgD(集団レベルのデータ)のみがある.  Aをアンカーとして、BとCの効果を比較するのが今回の目的となっている. 
AB試験とAC試験でNは, 500と300, 年齢の範囲は, 45~75と45~55(IPDがあるAB試験がACの範囲を包括していることに注意), 女性比率は, 64%と80%としている.

個人iの治療tのときのアウトカムは以下のロジットモデルで生成されると考える.

ただし, Aの効果を基準としたときのBとCの効果量は,

と設定する. 今回のシミュレーションモデルではBよりCの方が効果があるという設定になっている. 以上のモデルでは年齢がeffect modifier(効果修飾因子)となっているため, NMAではバイアスが生じてしまう.年齢を調整する必要があるので, MAICで調整を行うというのが手法選択の理由である. 

シミュレーションデータの確認

Appendix DのRコード(https://www.sheffield.ac.uk/nice-dsu/tsds/population-adjusted)のデータ生成の部分を実行したものとして, データを確認する.

AB試験のデータを6行(こちらはIPDを持っている設定のため, アクセス可能なデータ).

AB.IPD %>% head()
## # A tibble: 6 x 5
##   ID      age gender trt       y
##   <chr> <int> <fct>  <chr> <int>
## 1 001      45 Male   A         1
## 2 002      71 Female A         1
## 3 003      58 Female A         1
## 4 004      48 Female A         1
## 5 005      69 Male   A         1
## 6 006      48 Female A         1

AC試験のデータを6行(こちらはAgDのみの設定なので, アクセス不可能なデータで, シミュレーションのため発生している. 推定の際には個々のデータは使えない).

AC.IPD %>% head()
## # A tibble: 6 x 5
##   ID      age gender trt       y
##   <chr> <int> <fct>  <chr> <int>
## 1 001      46 Female A         0
## 2 002      52 Female A         1
## 3 003      51 Female A         1
## 4 004      55 Female A         1
## 5 005      53 Male   A         1
## 6 006      51 Female A         1

AB試験のIPDデータの要約統計量は

AB.IPD %>% group_by(trt) %>% 
  summarise(n(), mean(age), sd(age), `n(male)`=sum(gender=="Male"),
            `%(male)`=mean(gender=="Male"),sum(y),mean(y))
## # A tibble: 2 x 8
##   trt   `n()` `mean(age)` `sd(age)` `n(male)` `%(male)` `sum(y)` `mean(y)`
##   <chr> <int>       <dbl>     <dbl>     <int>     <dbl>    <int>     <dbl>
## 1 A       250        60.5      9.13        88     0.352      216     0.864
## 2 B       250        60.1      9.07        91     0.364       39     0.156

AB試験のIPDデータの要約統計量は

AC.IPD %>% group_by(trt) %>% 
  summarise(n(), mean(age), sd(age), `n(male)`=sum(gender=="Male"),
            `%(male)`=mean(gender=="Male"),sum(y),mean(y))
## # A tibble: 2 x 8
##   trt   `n()` `mean(age)` `sd(age)` `n(male)` `%(male)` `sum(y)` `mean(y)`
##   <chr> <int>       <dbl>     <dbl>     <int>     <dbl>    <int>     <dbl>
## 1 A       150        50.1      3.29        36      0.24      120     0.8  
## 2 C       150        49.7      2.96        30      0.2        17     0.113

各試験においては, ランダム化しているので共変量は群間でうまくバランスしているが, AB試験とAC試験では平均年齢と男性割合が異なっていることが分かる(要約統計量はどちらも確認できる. ただし, 論文のTable1にある変数に限られる).

今回, AC試験について使用する集計値データは以下のようになる.

AC.AgD
##   age.mean   age.sd N.male prop.male y.A.sum y.A.bar N.A y.C.sum   y.C.bar
## 1     49.9 3.128785     66      0.22     120     0.8 150      17 0.1133333
##   N.C
## 1 150

MAICの重みの推定

調整したい共変量(ここではage)をバランスさせるような重みを考える.

以下のように, 共変量を条件付けたときの各試験に組み込まれる確率を考えて, その確率をロジットモデルで仮定すると,

となる.

となっているのは, 計算を簡略化するために, IPDのある試験の共変量から,集計値のみの試験の共変量の平均値を引いたものを出している(両方の分布を平行移動させているイメージ).

上のウェイトで加重平均を出したものが0に(平行移動させた後の共変量の平均, つまり0に)一致するようにモーメントが釣り合うような条件式は

となる。

上の式から

が導ける. この式を満たすようなパラメータα1を求めたい.

この解は,

を最小化するパラメータα1に等しく, 一意であり一致推定量となることが示されている. これは、

の右辺が

の一階条件であり, 二階微分した

は正定値であり,

を最小化するαが上の方程式の解に等しく, また一意であるため.

要点をまとめると
モーメントが釣り合うようなウェイトのパラメータαを求める.

モーメント条件の方程式が出て, 平行移動しても同じなので, 平行移動して

「αの関数=0」

の形の方程式にして, それの解wを求める.


expを足し合わせる関数になっていて, 数値計算の都合上と思われる(たぶん).
方程式の解を求めるのではなく, その方程式の右辺の関数は

の関数の一階条件となっているうえ, その関数の二階微分したもの(ヘッセ行列)が正定値行列になっており, その関数を一意に最小にするようなαは, 一階条件の解, すなわち上の方程式の解となっている. 方程式の解を求めるのではなく, 最小化の形に持っていく等価な問題に置き換えているということである.

したがって, これを最小化する.

objfn <- function(a1, X){
  sum(exp(X %*% a1))
}
# gradient関数を求めているのは最適化を高速化させるため.
gradfn <- function(a1, X){
  colSums(sweep(X,1,exp(X%*%a1),"*"))
}

共変量を平行移動したもの.

X.EM.0 <- sweep(with(AB.IPD, cbind(age, age^2)),2,
                with(AC.AgD, c(age.mean, age.mean^2+age.sd^2)),"-")

最適化の実行.

opt1 <- optim(par=c(0,0), fn=objfn, gr=gradfn, X=X.EM.0, method = "BFGS")
opt1
## $par
## [1]  3.32289873 -0.03404291
## 
## $value
## [1] 192.6877
## 
## $counts
## function gradient 
##       48       11 
## 
## $convergence
## [1] 0
## 
## $message
## NULL
# gradientなくても使える。速度は多少遅くなるが.
# optim(par=c(0,0), fn=objfn, X=X.EM.0, method = "BFGS")

推定されたパラメータからウェイトを求める. ここでは, ウェイトが何人分にあたるのかを理解しやすいようにリスケールしている.

a1 <- opt1$par
wt <- exp(X.EM.0 %*% a1)
wt.rs <- wt/sum(wt) * N_AB

ウェイトの要約統計量とヒストグラム.

##        V1          
##  Min.   :0.000000  
##  1st Qu.:0.000011  
##  Median :0.052907  
##  Mean   :1.000000  
##  3rd Qu.:2.071826  
##  Max.   :3.767246

近似的な有効サンプルは

sum(wt)^2/sum(wt^2)
## [1] 173.845

となっている.

重み付けしたABの年齢分布(平均と標準偏差)とACの年齢分布(平均と標準偏差)がバランスしていることが確認できる(上がウェイト付けしたAB試験の年齢の平均と標準偏差, 下がAC試験の年齢の平均と標準偏差).

## # A tibble: 1 x 2
##   age.mean age.sd
##      <dbl>  <dbl>
## 1     49.9   3.14
##   age.mean   age.sd
## 1     49.9 3.128785

ウェイト付けデータによる推定結果

AB試験のデータにウェイトをつけてロジスティック回帰. AC試験の集団と年齢の分布がバランスした分布で行っていることになる.

fit1 <- AB.IPD %>% mutate(y0 = 1-y, wt=wt) %>% 
  glm(cbind(y,y0) ~ trt, data = ., family = binomial, weights = wt)
fit1
## 
## Call:  glm(formula = cbind(y, y0) ~ trt, family = binomial, data = ., 
##     weights = wt)
## 
## Coefficients:
## (Intercept)         trtB  
##       1.331       -2.687  
## 
## Degrees of Freedom: 499 Total (i.e. Null);  498 Residual
## Null Deviance:       267 
## Residual Deviance: 196.5     AIC: 168.2

サンドウィッチ分散を出す.

V.sw <- vcovHC(fit1)
d.AB.MAIC <- coef(fit1)["trtB"]    #Bの効果(係数が対数オッズ比)
var.d.AB.MAIC <- V.sw["trtB","trtB"]    #Bの効果の分散

# Estimated log OR of C vs. A from the AC trial
d.AC <- with(AC.AgD, log(y.C.sum * (N.A - y.A.sum) / (y.A.sum * (N.C - y.C.sum))))
var.d.AC <- with(AC.AgD, 1/y.A.sum + 1/(N.A - y.A.sum) + 1/y.C.sum + 1/(N.C - y.C.sum))

ACの対数オッズ比からABの対数オッズ比を引いて, BCの効果を求める.

# Indirect comparison
print(d.BC.MAIC <- d.AC - d.AB.MAIC)
##      trtB 
## -0.756381

その分散を求める.

print(var.d.BC.MAIC <- var.d.AC + var.d.AB.MAIC)
## [1] 0.2552748

真の値(βの差分で-0.4)とMAICで求めた値と未調整で求めた値(95%信頼区間付き)を図示すると

となり, 未調整で推定した場合よりはMAICをした方がいい!!とは今回の結果からは必ずしも言えない. サンプルサイズを増やしてみると良い感じというのが実感できた(ここには結果を載せていない). また, シミュレーションを1回でなく, たくさん回して真の値のカバー率とかを確認してみるのが良さそう(こっちはコードを書いていない).

 

参考文献

以下の文献が参考になる. 

・NICEのTSD18  

https://www.sheffield.ac.uk/nice-dsu/tsds/population-adjusted  

 ・Signorovitch et al. (2010)  

"Comparative effectiveness without head-to-head trials: a method for matching-adjusted indirect comparisons applied to psoriasis treatment with adalimumab or etanercept"

https://pubmed.ncbi.nlm.nih.gov/20831302/

・製薬協の資料

間接比較において母集団調整法は有用か?
Matching Adjusted Indirect Comparison及びSimulated Treatment Comparison

https://www.jpma.or.jp/information/evaluation/results/allotment/indirect_comparison.html

 

【学習予定】

MAICの理解がまだ浅いので, もう少し深めていきたい. Population-adjusted indirect comparisonsには他にも手法があるので, そちらも学んでいきたいところ.

本について語るとき某の語ること

2人で話しているポッドキャスト番組をいくつか聞いていると、聞き手の知らない単語を語り手が使ったとき、聞き手の側が自然にその単語はどうやって漢字で書くか尋ねる番組と、そうでない番組があることに気付く。後者の番組を聞いていると、なぜ漢字変換してくれないのかと、ストレスに感じてしまうことがある。どうして、その差が出るのか考えたとき、私は漢字変換して意味を捉えて記憶していこうとする一方で、音声としての認識は記憶の中で多少ぼんやりしていることがある一方で、漢字変換しない人は別の認識方法で言葉を捉えているのだと感じる。言葉を、漢字のような図画を優位として認識する人と、発音などの音声を優位として認識する人で、世界の捉え方はきっと異なるだろう。他の人の脳内の処理を覗き見ることはできないから、想像の範囲でしかないのだけれど、同じ人間とはいえ、認識のやり方は人によって異なるのだと思う。

本の読み方もまた人によって違う。その違いが顕著に感じられたのは、オモコロのこの記事(https://omocoro.jp/bros/kiji/366606/)だった。これは、本を読んだ経験のほとんど無いライターが仲間のライターの助けを借りながら『走れメロス』を読み進めるだけの記事なのだが、ライブ感があって生き生きとしているし、他人の読書を追体験でき、とても面白かった。ワンカット、ワンカット、噛み締めて読んでいるのが良い。私なら軽く目を通して読み飛ばしてしまう文に対しても、この記事の読書ではリアクションしている。ここまで一文一文に正面から向き合った経験は私にはほとんどない。

文章と脳内の処理の違いを扱ったもので、印象に残っているのが、twitterで昔見かけた『本を読むのが遅い人』というタイトルの漫画だ(https://twitter.com/3MshXcteuuT241U/status/1547091314281713664?s=20)。1冊の本を、1日数ページしか読み進められないのだけれど、物語の世界観に没入しながら半年かけて読み終える、上司の姿に、作者が心動かされる体験談を描いたものだ。他に印象に残っているのは、これまたtwitterで、小説を書くときのことをつぶやいているツイートのまとめ(https://togetter.com/li/1976393)なのだが、脳内で映像を再生して書いている人や静止画を思い浮かべて書いている人、文章がそのまま浮かんで書いている人など色々なタイプの人がいた。私は文章を読みながら鮮明に情景を思い浮かべることは少ない。どちらかというと、文章から想起されるぼやっとしたイメージと、それに関連して思い浮かぶ知識や経験が紐づきながら、文章を読んでいる気がする。文章の脳内での処理のプロセスはこんなに異なっているのはどうしてだろうか。異なったプロセスで読書をしているのに、面白い、良かったと感想を共有できている(もしかすると、できているように見えているだけなのかもしれない)のは一体何なのだろうか。読み方のプロセスは先天的にタイプが決まっているのか、それとも後天的に発達していくものなのだろうか。疑問は多く残る。こういうことは認知科学あたりが研究しているのだろうか。

文章の読み方で、もう一つ気にかかったのが、このnoteだ(https://note.kishidanami.com/n/n6cc7d7d8a1de)。作者のエッセイが中学入試の国語の問題で出題され、作者本人がその問題に挑んでみたものの解けなかったが、担当の編集者に解いてもらったら全て正解だったので、驚いたという話だ。編集者は一文、一文の意図と効果を明確に意識した読みをしているそうだ。読み方について考えるための材料は、編集者の視点にあるのかもしれない。

東京ポッド許可局というポッドキャスト番組の1つのコーナーで、「忘れ得ぬ人々」というものがある。このコーナー名の元ネタがおそらく国木田独歩の『忘れえぬ人々』にあるということに最近気付いて、青空文庫(https://www.aozora.gr.jp/cards/000038/files/1409_34798.html)で読んだ。脳内に自分なりのイメージを浮かべながら読んだ。忘れえぬ人々についての語り口がとても良かった。

 

『因果推論入門~ミックステープ:基礎から現代的アプローチまで』の学習記録

【学習動機】

Scott Cunninghamの"Causal Inference: The Mixtape"の和訳本の『因果推論入門〜ミックステープ:基礎から現代的アプローチまで』をご恵投いただきました。ざっと目を最後まで通したので、書評と言えるほど、たいそうなことは書けないが、読後感を書いていく。

 

【学習内容】

「DAGとsynthetic control methodも含まれてて、RとStataのコード付きの因果推論本!」というのが読む前の第一感だった。一通り読んでみて、第7章の操作変数や第9章の差分の差デザインが個人的には良かった。操作変数法(IV)も差分の差デザイン(DID)も使う機会が無かったこともあり、ほとんど知識が抜けて落ちているということに加え、とくにDIDはここ数年で整備された感があり、日本語の成書として目を通しやすい形になったという点で良かった。第10章の合成コントロール法も、存在は知っていたが、日本語で成書になっているのは、自分の知る限りでは知らない。もちろん、これから発展しうる分野ではあるが、いざ使うとなったときに、取っ掛かりとして使えそうで良いと思った。第一感通り、RとStataのコードが利用できるというのが良い(内容は難しいところもあるけれど、プログラムを回しながら理解を進めることができる)し、知識の点検と更新に役立った。ざっくりとした読後感を書いたところで、以降、少し詳しく書いていくことにする。

さて、タイトルに「因果推論入門」とあるが、テキストのタイトルあるあるで、「入門」からイメージされる通りにこれを使って0から入門する!というのは少し難しいかもしれないと感じた。p18に対象読者について書いてあるように、「実証分析に興味のある方々」、「研究のツールを一新したいと考えている、経験を積んだ社会科学者」、「産業界やメディア界やメディア、シンクタンクなどに所属する、アカデミア外の方々」が念頭に置かれている。実際、経済学などの社会科学や計量経済学などの計量系分野をかじっていた方が読みやすい本ではあると思う。そういうことを触れてこなかった人は、触れてきた人を誘って輪読するなどするか、p7の訳者まえがき(訳者まえがきがとくに親切な印象だった)にある、計量経済学や因果推論のテキストに紹介されている本やp17,18に書かれている本(こちらは英語)と併読するのが良いと思われる。書かれていなかった和書で追記しておきたいのは、田中先生の『計量経済学の第一歩 実証分析のススメ』で、計量経済学の入門書として読みやすい一冊だと思う。

タイトル関連でもう一つ言うと、「ミックステープ」というのも特徴的だった。p6の訳者まえがきに書かれているように、ミックステープは「さまざまな音源から複数の楽曲を自由に集めて編集した作品」である。p17の本書の存在意義への言及でもあるように、読みやすい入門書がこれまでになかったから、その穴を埋めるように編み上げたものであり、原著者が因果推論の理解の道標として良いと思う構成で作られているように思った。統計学とその周辺は色々な分野に渡って発展しているため、分かりにくい。農学、医学、疫学、心理学、工学、経済学、数学などなど。分野によって、統計の使用の意欲や前提、背景が異なってくる。そういう事情があるので、上手くまとまった良い本があると嬉しいという気持ちには共感した。あと、昔、TSUTAYAや友人からCDを借りて、自分の好きな曲を集めたMDを作成していた頃を少し思い出したりもした(今ではサブスクリプションサービスのプレイリストだが)。

次に、海外のテキストあるあるで、分厚さがある分、日本語で書かれた簡潔なテキスト(講義使用目的で簡略化してあったり、読者への期待が高かったりする)よりも、お気持ちなどが省略されずに書かれていることが多くて良いと感じ今ある和書では読めないことも書かれており、手法の使用の歴史など、単なる手法紹介本だと省略されているか調査されていないような点の記述があって、ありがたい。加えて、それでも省かれてしまっていて、読みにくい部分については、丁寧に訳注が付いていると思った。読みながら、あれ?これは何を言っているんだ?と躓きかけたところで、訳注に助けられた!というところも多かったように思う。

最後に、参考になりそうなリンクを繋げていくことにする。第一に、原著者本人の、ミックステープのページ。中身が気になる人はこちらを眺めてみるのも良いと思う。

https://mixtape.scunning.com/

第二に、原著者本人の、youtubeチャンネル。著名な経済学者らとの対談の動画がある。

https://www.youtube.com/@scunning/videos

第三に、篠崎先生の因果推論に関する講義動画。

https://www.icrweb.jp/course/view.php?id=412

https://www.icrweb.jp/course/view.php?id=413

最後に、手前みそになるが過去にブログで書いたものも貼り付けておく。

『効果検証入門』の学習記録 - 霞と側杖を食らう

LaLonde(1986)とその周辺の学習記録 - 霞と側杖を食らう

 

【学習予定】

一通り軽く読んだので、必要が生じたら、「聞きたい曲」をその都度「聞き直し」ていくということになると思う。計量経済学もちゃんと勉強しなおしたいという思いはあるが、中々腰を据えるのは難しい。

今回の本とは関係のないお気持ちなのだが、統計学とその周辺に関しては、幅広いし、奥深いので、何も分からん!ということに度々陥ることがある。統計学計量経済学等の計量系分野の素晴らしい先生方が日本にはたくさんいらっしゃるのだから、もっと言語化してテキストを書いてくれたらありがたいのになぁと思うばかりです。

日本酒検定3級の学習記録

【学習動機】

日本酒を飲むことは昔から好きだった。たくさん飲んで、美味しいかどうかは感じるが、それ以上の解像度は持てずにいた。1年を通して、何種類か印象的に美味しいと感じた銘柄を覚えているかどうかといった程度だった。この1年間は4合瓶を酒屋で買って、味わって飲むようにして、飲み終わったらラベルを保存して、味わいを記録するようにした。そのようにしていたら、日本酒の解像度が上がったのだが、日本酒を語るための言葉が自分に足りないことを実感した。足りない言葉を求めて、体系的に学ぶ動機付けに日本酒検定を受けることにした。学習して、3級は取得できたので、その学習記録をここに記す。amazonのリンクを貼っているが、少し小銭稼ぎが必要な時期なので、アフィリエイトリンクを利用しています。

【学習内容】

テキスト通読

以下の3級のテキストから主に出題されるとのことで通読と暗記。
- 日本酒検定3級用テキスト『酒仙人直伝 よくわかる日本酒』
https://amzn.to/43WN1ok

このテキストは70ページほどで基礎知識がよくまとまっていて分かりやすいと思う。詳細や理屈などは省かれているので、それは以下の2級より上のレベルのテキストにある。個人的にはこちらのテキストの方が、網羅的で読みやすく感じた(3級レベルだと不要な知識も多いとは思う)。
- 日本酒検定2級より上のレベルのテキスト『新訂 日本酒の基』
https://amzn.to/4axwXvJ

過去問演習

以下のサイトに掲載されているもの等を参考にして、過去問演習して試験問題の傾向を把握した。

(上の問44の酒気帯び運転の罰則の問題の解答はおそらく間違っている。車両提供者と見間違えていたか酒酔い運転と見間違えていたのかもしれない。
道路交通法の平成19年の法改正後
https://www8.cao.go.jp/koutu/taisaku/r04kou_haku/zenbun/genkyo/feature/feature_02_2.html
には
酒類の提供者
酒気帯び運転への酒類の提供者は2年以下の懲役又は30万円以下の罰金
酒酔い運転への酒類の提供者は3年以下の懲役又は50万円以下の罰金
とある)

その他

他に学習したものもメモしておく。

こちらは30年前に書かれているため2023年現在の実情や最新の知見が反映されているわけではないが、昭和期の技術革新による動きが克明に書かれていて良かった。読み口が軽やかで、日本酒の基本に加えて、昭和期の話についても知りたい人には良い一冊だと思う。

こちらは、明治30年(1897年)から平成6年(1994年)を生き抜いた、発酵や醸造の世界的権威であった人によって書かれた本で、初版は1964年で新書の最終版は1989年だそうだ。秋山裕一の『日本酒』が昭和後期の機械化などのリアリティが感じられるのに対して、『日本の酒』はもう一つ前の時期の日本酒業界のリアリティが伝わって面白い。日本酒学の源流を知れて面白かった。

動画の編集がしっかりしていて、見て学べて面白い。

ポッドキャストの2番組が日本酒について語っている回があるので、そちらも参考になった。

  • 飲んで学習
    日本酒を飲みながら、今まで学んだことと突き合わせてみたり、ラベルを読んでそのお酒の理解を深めたりした。

【学習予定】

上に書いた感じで学習したら、普通に3級は取得できたので、次は2級の取得を目指す。

【追記 : 2024/02/04】 美味しさの表現に関して、これまで読んだりしたものをまとめたので、その記事を貼っておく。

moratoriamuo.hatenablog.com

【追記終わり】

めぐろLT会#2の後日譚々

めぐろLT会#2 @ラクスル目黒オフィス にてLTを行ってきました。

オフラインでのイベントが減った昨今、久々にオフで集まってワイワイしようぜということがイベントの趣旨のようで、実際、私も数年ぶりに外部でオフラインで登壇することとなりました。そのときのスライドがこちらになります。

speakerdeck.com

 

2022年の振り返りはこちらの記事でもやっています。

moratoriamuo.hatenablog.com

 

応募されたテーマが「今年度反省、新年度の抱負」だったので、そのような内容になっています。めぐろLT会は、@y__mattu さんからのお誘いで参加することに決めたのですが、どんな人が集まるか分からなかったので、内容をどこに範囲でどのくらいの深さにするか決めるのに悩みました。結果として、こんな感じになっています。唯一、参加者の皆様と共通していたのは、目黒を知っているということだけだったので、目黒要素を入れようと思い、浮世絵の画像を入れておきました。浮世絵は https://ja.ukiyo-e.org/ から「meguro」と検索して、入手しました。浮世絵は好きで、表参道にある太田記念美術館という浮世絵専門の美術館に行ったりしてます。あと、川崎駅にある川崎浮世絵ギャラリーも何度か行ったことがあります。

 

久しぶりの発表ということで緊張していたことと、発表順が最後だったこともあり、他の方のLTをあまり記憶できていないのですが、TLを遡りつつ覚えていることを少し箇条書きで書きます。

・UXライティングという概念を知らなかったので興味深かった。

・エンジニアのスクラムの概念は知っていたが、管理・運用の実際はどうなっているのか気になった。

・学生のお二方、この前の弁財天のでこぼこの二人かな?弁財天はオンラインで参加していたから、確信はできなかった。

Tiktokの流行曲予測、面白かった。流行の曲調のトレンドがあったりするのか気になったのと、新しく出てすぐ流行ってしまうものは拾うの難しそう。自分がやるなら、リバイバル系を当てるに絞ったりするかもなぁと考えたりした。データ分析系で一番親近感があった。

・バランスを考える話。色々なことができて、色々なことがやりたくて、色々なことをやらないといけない状況を楽しめてていいなぁと羨ましがったりしていた。visualizationの話とか聞いてみたかった。

・開発の攻防の具合の話。開発とは少し違うが、自分は守り多めを主体にしつつ、たまに攻めかな。

・業務改善系の企業のお話。出番一つ前であまり聞けず残念。

以上です。

 

オフラインで発表すると、リアルタイムの反応があって、やはり楽しかったです。ここ数年、オンラインでのやり取りが多かったためか、発表中に画面ばかり見てしまうようになっていたのは少し反省。登壇機会を増やして、調整していきたいところ。明日(今日)は、朝から友人の結婚式に参加する予定なので、振り返りはこのくらいにしておきます。

 

最後に、登壇する機会を与えてくださった、めぐろLT会の運営の皆さま、参加者や関係者の皆さま、ありがとうございました。