不整脈

読んだ。

INTENSIVIST VOL.1NO.4 2009 (特集:不整脈)

INTENSIVIST VOL.1NO.4 2009 (特集:不整脈)

  • 作者:藤谷茂樹
  • 出版社/メーカー: メディカルサイエンスインターナショナル
  • 発売日: 2009/11/30
  • メディア: 単行本(ソフトカバー)
COI:古くて安かったので買って積んでたのを時間ができたので読んだ。

不整脈治療はCAST試験の前と後で変わる、というまえがきで始まる。
www.ncbi.nlm.nih.gov
不整脈治療を抗不整脈薬ですると、逆に予後が悪い、という話で、それならば不整脈治療はいったいどうすればいいんだ、という話になる。

本書は心房細動と、心室不整脈に大別して2009年頃のエビデンスをあげている。
心房細動はrate control、というのが(いまでも)定説だが、そのエビデンスとなった研究の経緯がそこそこわかった。

心室不整脈はリドカイン一択なのだが、Naチャネル阻害は心機能低下時にはダメ、ということで、でもリドカインしか使ったことないしなあ…と思いながら、アミオダロンの話が多く書かれていた。
現代ではアミオダロン一択だと思うが、10年も前ならリドカインか、ニフェカラントだったのだろう。ニフェカラントはマジで使ったことない。

ワンコイン以下で買えたので、最新のエビデンスはどうでもいいけど病態生理くらいは知りたい、という場合にはよい。ただし不整脈は何度勉強してもよくわからない。

線虫でがん検査、約85%の確率で特定

という記事を観測した。
詳細はいつもの通り不明だが、記事によると、

がん患者1400人に実施した検査では的中率は約85%に上り、特にステージ0~1の患者は87%で判定できた。一般的ながん検査「腫瘍マーカー」よりかなり高確率という。
反応するのは胃、大腸、肺、乳、膵(すい)臓、肝臓、子宮、前立腺など15種のがん。現時点では検査でがんの部位までは判明しないが、今後は特定も目指す。

ということらしく、あるか、ないかはわかる。そして、がん患者という陽性例に対して検査性能をはかっているので、感度は85%のようである。

こんな話をやっていた。
mikuhatsune.hatenadiary.com
この手の話の場合、たいてい事前確率が低いと事後確率も低い、という話になる。
ここから感度と特異度と事前確率のスクリプトをパクる。

事前確率は日本のがん統計から取ってくる。
ganjoho.jp
2018年度版のがん統計の、incidence(罹患率)はここからの引用らしい。罹患率が事前確率でいいかはこの際置いておく。
www.ncbi.nlm.nih.gov

55歳以下だとせいぜい2%、80歳くらいの高齢者でも6%くらい。
f:id:MikuHatsune:20200117193233p:plain

post <- function(pre, sn, sp){
  res <- array(0, sapply(list(pre, sn, sp), length))
 for(pre1 in seq(pre)){
   for(sn1 in seq(sn)){
     for(sp1 in seq(sp)){
        res[pre1, sn1, sp1] <- (pre[pre1] * sn[sn1]) / (pre[pre1] * sn[sn1] + (1-pre[pre1])*(1-sp[sp1]))
      }
    }
  }
  return(res)
}

incidence <- c(0.2, 0.35, 0.9, 2, 5, 10, 25, 70, 100, 200, 300, 600, 800, 900, 1100, 1200, 1100, 1000)
names(incidence) <- c(sprintf("< %d", seq(5, 85, 5)), "85+")
log_incidence <- log10(incidence)

par(mfrow=c(2, 1), mar=c(4, 5, 2, 2), las=1, cex.lab=1.2)
plot(log_incidence, type="o", pch=15, xaxt="n", yaxt="n", xlab="Age group", ylab="罹患率 10万人あたり", lwd=3)
axis(1, at=seq(incidence), labels=names(incidence))
axis(2, at=0:3, labels=10^(0:3))
abline(h=0:3, lty=3)
title("各年齢層におけるがん罹患率")

txt <- "Cancer Epidemiol. 2014 Oct;38(5):490-5. \nがんの統計’18 "
text(par()$usr[2], par()$usr[3], txt, xpd=TRUE, adj=c(1, -0.5))

p <- post(pre=incidence/100000, sn=0.85, sp=0.85)[,,1]
par(mar=c(5, 5, 2, 2), las=1)
plot(p, type="o", pch=15, xaxt="n", xlab="Age group", ylab="検査結果陽性で本当に癌の確率", lwd=3)
axis(1, at=seq(p), labels=names(incidence))
title("感度 0.85,特異度 0.85 の検査による各年齢層のがん事後確率")

急性心不全

読んだ。

INTENSIVIST VOL.2 NO.4 2010 (特集:急性心不全)

INTENSIVIST VOL.2 NO.4 2010 (特集:急性心不全)

  • 作者:
  • 出版社/メーカー: メディカルサイエンスインターナショナル
  • 発売日: 2010/11/01
  • メディア: 単行本
COI:古すぎて激安だったのを買って積んでたけど最近心不全が多いのでまた急いで読んだ。

意識低い系なのでCS1-5が何となくわかっていて、でも診るのはCS1がほとんどでニトロとNIPPVで終わり、みたいなことが多いので勉強した。
例によって序盤は心臓生理、心不全とは、みたいな話で、圧容量曲線の解説が詳しかったので満足した。
JBPOT取得者なので心エコーの話も良かったと思う。

ECMO

読んだ。

INTENSIVIST Vol.5 No.2 2013 (特集:ECMO)

INTENSIVIST Vol.5 No.2 2013 (特集:ECMO)

  • 作者:
  • 出版社/メーカー: メディカルサイエンスインターナショナル
  • 発売日: 2013/04/17
  • メディア: 単行本
COI:中古で激安だったので買って積んでいたけど、VV-ECMOに関わる機会があったので急いで読んだ。

Intensivist はたいてい序盤で生理学について書いてあるので、ECMOの原理はここでほとんどわかった(はず)。
もともと小児領域でエビデンスが増えていったが、成人ではインフルエンザパンデミックのときに流行ったとかなんとか。
もう7年も前になるのでエビデンス自体はもっと新しいものが蓄積されているだろうが、生理学や原理のところはたいして変わらないだろうと思うのでよいと思う。

個人的に興味深かったのが、ECMOを使ったECPRは500-600万円/QALY だが、普通にやるCPRは1860万/QALY というところで、CPRするヤル気が完全にゼロになった()。

これ読んでもワンランク上の心臓麻酔できなさそう

読んだ。

ワンランク上の心臓麻酔に必要なエビデンス

ワンランク上の心臓麻酔に必要なエビデンス

  • 作者:
  • 出版社/メーカー: 克誠堂出版
  • 発売日: 2018/05/01
  • メディア: 単行本
COI:上司が持ってた。

ペラい。正規で買っても5000円くらいなので妥当か。
なんとも言えないが、これ読んでもワンランク上の心臓麻酔はできなさそうである。そんなに高級な心臓麻酔はしていないのであれだが。
プロタミン/ヘパリン拮抗は0.73とか、ACT 135で出血合併症が増えるとか、そういう普遍的にどこでも通用しそうな話はよかった。
あと、成人先天性心疾患患者の予後とか、移植患者の出産とか、そういう特殊すぎて誰もしないだろう、みたいなやつの疫学とか。

「有意ではないが、○○は△△に比べて高いor低い傾向があった」っていう記述が何回も見られるけど、こいつら帰無仮説検定わかってんのかな?って思った(原著がこう言ってるのか、執筆者がそう解釈して言っているのかは検証していない)。

同じシリーズでこれが気になってるけど、心臓麻酔のクオリティがこんなんなら買うのためらっている。

ワンランク上の産科麻酔に必要なエビデンス

ワンランク上の産科麻酔に必要なエビデンス

  • 作者:
  • 出版社/メーカー: 克誠堂出版
  • 発売日: 2017/06/01
  • メディア: 単行本

「男女間モテ格差」をzero-inflated model で考える

こんな話を見つけた。


元ネタ、データはこちらにある。
note.com

データとしては、20代の男女各200人からアンケート調査によって、過去に告白したことがあるか、されたことがあるかその回数を聞いている。
ここで、

「過去告白した回数」よりも、「過去告白された回数」において大きな差があることが確認できる。特に「過去告白された回数」が「0回」における男女差が大きく、男性は51.5%と半数以上が告白されたことがないのに対して、女性は25.0%にとどまる。以上より分布の点から「男女間モテ格差」があることが確認できた。

とあり、
「過去告白された回数」が「0回」という非モテ(筆者注:ワイが言ってるだけで引用元ではない)がおおよそ男女で50%:25% という差がある。
この上で、

平均値をみると、「過去告白した回数」は男性1.66回、女性1.26回と男性の方が多い。一方、「過去告白された回数」は男性1.60回、女性3.03回と、女性の方が倍近く多い。平均値の点からも「男女間モテ格差」があることが確認できる。

とあるが、告白されるのは少なくとも非モテではない集団なので、告白される回数が0回の非モテ集団の告白される回数を足しあわせてそのまま集団の平均として出すのは、非モテでない人たちの告白される回数を過小評価する。
というわけで、非モテは告白されることはないので、この非モテ集団がアンケート調査内にどれだけいたかを推定して、非モテでない集団が通常どれくらい告白されるのかをきちんと推定してみたい。

となればzero-inflated model である。

zero-inflated model のstan コードはこちらにあるので、丸々パクってやってみる。
mc-stan.org
stan コード中の\theta非モテ集団の割合(二項分布のパラメータ)で、\lambda非モテでない集団が平均して告白される回数(ポアソン分布のパラメータ)である。
引用元には告白する回数、される回数が男女別で割合が載っているが、サンプルサイズN=200, 告白する/される回数の水準がいくつか結合されているので、割合を参考に適当にリサンプリングして、引用元の平均値±0.01 に収まるシミュレーションデータをstan に投げる。ここで、告白10回以上は適当な予備実験の結果、最大15回ということにしておいた。target 記法で頑張ればここらへんはなんとかできそうな気がする。
がんばりたい人はこちらを読もう。

StanとRでベイズ統計モデリング (Wonderful R)

StanとRでベイズ統計モデリング (Wonderful R)

リサンプリングしたデータはこのような感じになる。なお、回数を覚えていないというのは面倒なので除いた。

f:id:MikuHatsune:20200103195547p:plain
リサンプリングで作成したシミュレーションデータ

・告白した回数について
一度も告白したことのない男性は\theta=0.35、女性は\theta=0.42 (p=0.126) だった。
告白した回数については男性は\lambda=2.57回、女性は\lambda=2.17回 (p=0.04) だった。
告白をすることに関して非モテ(消極的?)は男女間で差はなさそうだが、非モテでない集団では男性のほうが告白回数は多いようである。ただし0.5回の多さが重大な差なのかは不明。

・告白された回数について
一度も告白されたことのない男性は\theta=0.5、女性は\theta=0.25 (p=0) だった。
告白された回数については男性は\lambda=3.19回、女性は\lambda=4.02回 (p=0.00083) だった。
告白されたことのない男性は女性にくらべてすごい多いようである。そもそも50%ってアンケート調査の半分だしこれってどうなん? 感はあるが、残りの半分100人でも推定はうまくいっている。
告白された回数については、ほぼ1回くらいの差がついた。

現実には4回告白される人が平均的に多い、とはちょっと考えにくいような気もするけれども、アンケート調査結果的には3-5回くらいが多いようなのでまあそうなのだろう。
ヤリチン理論的に、何十回も告白されるような最強のモテ男女が存在しそうな気がするが、200人のサンプルサイズでは補足できなかったのか。。。

f:id:MikuHatsune:20200103195619p:plain
\theta\lambda

N <- 200 # サンプルサイズ

k <- list(c(0, 0), 1, c(2, 3), c(4, 5), 6:9, c(10:15))
u1 <- c(38.5, 16.5, 28.5, 9, 1.5, 2)/100 # 男性、告白した
u2 <- c(47.5, 18, 22, 8.5, 1.5, 0)/100  # 女性、告白した
p1 <- c(51.5, 14, 20, 6.5, 2, 5)/100 # 男性、告白された
p2 <- c(25, 8, 33.5, 13.5, 10, 6.5)/100 # 女性、告白された
up <- list(u1, u2, p1, p2)

me <- c(1.66, 1.26, 1.60, 3.03) # zero-inflated を考慮しない平均値
lm <- mapply(function(z) c(-1, 1)/100 + z, me, SIMPLIFY=FALSE)

# 分布をもとにリサンプリングでシミュレーションデータを作成する
# 10回以上の告白は、最大15として、適当にsample される確率に傾斜をかける
sim <- function(p){
  unlist(mapply(sample, k, size=p*N, replace=TRUE, prob=mapply(function(z) order(z, decreasing=TRUE)/(length(z)*(length(z)+1)/2), k)))
}

# iter 回データセットを作って
# zero-inflated model を考慮しない平均値に近いデータをsize 個採用することにする(計算時間の都合)
iter <- 15000
size <- 50
tmp <- mapply(function(z) replicate(iter, sim(z)), up)
tmp_m <- lapply(tmp, colMeans)
tmpTF <- mapply(function(z1, z2) z1[1] < z2 & z2 < z1[2], lm, tmp_m, SIMPLIFY=FALSE)
tmp <- mapply(function(z1, z2) z1[, z2], tmp, tmpTF)
dat <- mapply(function(z) z[, sample(ncol(z), size=size)], tmp, SIMPLIFY=FALSE)

# シミュレーションデータの例
cols <- c("blue", "red")
bar1 <- rbind(table(factor(dat[[1]][,1], 0:15)), table(factor(dat[[2]][,1], 0:15)))
bar2 <- rbind(table(factor(dat[[3]][,1], 0:15)), table(factor(dat[[4]][,1], 0:15)))


mf <- c("男性", "女性")
koku <- c("告白した回数", "告白された回数")
b0 <- list(bar1/rowSums(bar1), bar2/rowSums(bar2))
yl <- c(0, 0.6)
par(mfrow=c(2, 1), cex.main=2, las=1)
for(i in seq(b0)){
b <- barplot(b0[[i]], beside=TRUE, col=cols, ylab="割合", ylim=yl, main=koku[i])
for(j in seq(ncol(b))){
  for(l in 1:2){
    text(b[l, j], b0[[i]][l, j], round(b0[[i]][l, j], 2), srt=90, adj=c(-0.2, NA), xpd=TRUE)
  }
}
legend("topright", legend=mf, col=cols, pch=15, cex=2)
}

# 推定する
library(rstan)
rstan_options(auto_write=TRUE)
options(mc.cores=parallel::detectCores())

code <- "
data {
  int<lower=0> N;
  int<lower=0> y[N];
}
parameters {
  real<lower=0, upper=1> theta;
  real<lower=0> lambda;
}
model {
  for (n in 1:N) {
    if (y[n] == 0)
      target += log_sum_exp(bernoulli_lpmf(1 | theta),
                            bernoulli_lpmf(0 | theta)
                              + poisson_lpmf(y[n] | lambda));
    else
      target += bernoulli_lpmf(0 | theta)
                  + poisson_lpmf(y[n] | lambda);
  }
}
"

m0 <- stan_model(model_code=code)
fitres <- replicate(length(dat), vector("list", size), simplify=FALSE)
for(i in seq(fitres)){
  for(j in seq(size)){
    hoge <- dat[[i]][, j]
    standata <- list(N=length(hoge), y=hoge)
    fitres[[i]][[j]] <- sampling(m0, standata, iter=800, warmup=200)
  }
}

# theta とlambda だけとってくる
x <- lapply(fitres, lapply, extract, pars=c("theta", "lambda"))
X <- lapply(lapply(x, lapply, do.call, what=rbind), do.call, what=cbind)
est <- as.data.frame(t(sapply(X, apply, 1, median)))

# 男女の比較
mean(X[[1]][1,] > X[[2]][1,]) # 告白する、theta
mean(X[[1]][2,] > X[[2]][2,]) # 告白する、lambda
mean(X[[3]][1,] > X[[4]][1,]) # 告白される、theta
mean(X[[3]][2,] > X[[4]][2,]) # 告白される、lambda

# 密度分布をかく
library(MASS)
kd <- vector("list", length(fitres))
for(i in seq(kd)){
  x0 <- X[[i]][1,]
  y0 <- X[[i]][2,]
  kd[[i]] <- kde2d(x0, y0, c(bandwidth.nrd(x0), bandwidth.nrd(y0)), n=100)
}

xl <- c(0, 1)
yl <- c(0, 4.5)
cols <- c("blue", "red", "skyblue", "orange")
led <- c("男性・告白した回数", "女性・告白した回数", "男性・告白された回数", "女性・告白された回数")
sub <- sapply(seq(led), function(x) as.expression(substitute(z1~"("*theta==z2*","~lambda==z3*")", list(z1=led[x], z2=round(est$theta[x], 2), z3=round(est$lambda[x], 2)))))
par(mar=c(5, 5, 2, 2), cex.lab=2, cex.axis=1.5, las=1)
plot(0, type="n", xlim=xl, ylim=yl, xlab=substitute(theta~":非モテの割合"), ylab=substitute(lambda~":告白した / された回数"))
for(i in seq(kd)){
  points(X[[i]][1,], X[[i]][2,], pch=16, cex=0.5, col=grey(0.8))
}
for(i in seq(kd)){
  contour(kd[[i]], add=TRUE, col=cols[i], lwd=3)
}
legend("bottomright", legend=sub, col=cols, pch=15, cex=2.1)

legend に数式をいれるのに苦労した。
stackoverflow.com

Essentials of Trauma Anethesia

読んだ。

Essentials of Trauma Anesthesia

Essentials of Trauma Anesthesia

  • 作者:
  • 出版社/メーカー: Cambridge University Press
  • 発売日: 2017/11/09
  • メディア: ペーパーバック
COI:自費で購入。
本当はこちらの日本語訳を読もうと思ったけど、出版時に原著が3000円くらいだったようなので英語を読むハメになった。
外傷麻酔エッセンシャル 重症外傷の蘇生と周術期戦略

外傷麻酔エッセンシャル 重症外傷の蘇生と周術期戦略

  • 作者:
  • 出版社/メーカー: メディカルサイエンスインターナショナル
  • 発売日: 2019/06/04
  • メディア: 単行本
 
切断肢や頭・腹部がグチャグチャ、みたいなやばい外傷は来ないことになっているが、1年に1回くらいは交通事故で実は腸管穿孔してました、とか、開放骨折しているのでデブリや創外固定が必要です、みたいな症例には出くわす、くらいのテンション。
前半は外傷や熱傷時の生理や一般的な麻酔管理、後半は頭頸部、腹部、四肢の外傷、小児、高齢者、妊婦の外傷といった特殊症例に分かれている。
普通の麻酔に通ずる話が多かったので、外傷といっても特別になにか必要というわけでもなかった。極論すれば出血時に輸血が届くか、凝固系が破綻しないように頑張れるか、が鍵のようである。

書店で日本語版を立ち読みした印象としては、日本語版は買ってもよさそうではある。英語版はまあ普通の英語の本、という感じだった。