Communicating Risks and Benefits: An Evidence-Based User’s Guide (1)

“Communicating Risks and Benefits: An Evidence-Based User’s Guide”は、リスクと利益のコミュニケーション手法に関する洞察に富んだガイドであり、FDA(アメリカ食品医薬品局)が公表しています。製品やポリシー、サービスのリスクと利益に関連する情報を提供する組織の責任について、経済的観点、法的観点、そして倫理的観点から詳細に解説しています。

この記事では、この書籍PDFをAIに読み込ませて、要約を聞き出して記載しています。引用文献等も付していますが、これもAIが提示したものです。存在までは確認していますが、引用文献等の内容を詳しく確認した訳ではありません。

Introduction

このガイドは、リスクコミュニケーションという概念を用いて、情報の質が人々の健全な選択に影響を与えるシチュエーションを描き出しています。これは公共関係のコミュニケーションとは異なり、真実性への強いコミットメントと情報の歪曲を避けることで特徴付けられています。

具体的には、以下の3つの要素に注目しています:
1. 科学が人間行動のどの側面について語っているのか。
2. それらの科学的発見が実際にどのような意味を持つのか。
3. その科学的知見を基にしたコミュニケーションをどう評価するべきなのか。

このガイドは、コミュニケーションは科学的証拠に基づいているべきであり、既知の問題を無視せず、既知の事実を適切に活用すべきだという前提に立っています。さらに、たとえ最高の科学が提示されていても結果は必ずしも保証されないため、コミュニケーションの評価は必要不可欠であると指摘しています。

冒頭部では、製品、ポリシー、サービスのリスクと利益についての情報を伝える組織が負うべき経済的、法的、そして倫理的な義務が詳述されています。

この責任を果たすことが怠られた場合に生じる高額なコストとして、スリーマイル島、ハリケーン・カトリーナ、ビオックスといった事例が示されています。これらは、重要な情報が適切に提供されなかったと受け取られた場合に生じる事態の極端な例で、これには不適切に取り扱われた製品のリコール、誤ったラベル付けの家電製品、混乱を招く薬の使用指示などが含まれています。

また、序論部ではリスクコミュニケーションという概念が解説されています。これは、人々が適切な判断を下すために必要な高品質な情報を伝える状況を示す語で、その情報の精度へのコミットメントと誤解を避けるための手法で、公共関係のコミュニケーションとは別のものとして描かれています。

最終的に、このガイドが目指すものは、リスクコミュニケーションにおける科学的な結果と、その科学的根拠に基づくコミュニケーションの評価についての理解を深めることであると述べられています。

リスクコミュニケーションと言う概念

リスクコミュニケーションという概念は、特定のリスクに関する情報の伝達を指します。これは、公共の健康や安全に影響を及ぼす可能性のあるリスクについて、意思決定者や一般の人々に情報を提供するための手段として設計されています。

このガイドによれば、リスクコミュニケーションは、人々が健全な選択を行うために必要な高品質の情報を提供する状況で用いられる語彙です。これは公共関係のコミュニケーションとは異なるもので、その特徴は情報の精度へのコミットメントとスピン(情報操作や誤導)の排除にあります。情報が歪んだり、誤解を招くような形で提供されると、それは既に問題を抱えている人々をさらに混乱させ、傷つける可能性があると指摘されています。

リスクコミュニケーションは、リスクの決定がもたらす可能性のある利益(例えば、投資からの収益や医療処置からの健康改善など)とリスク自体を扱う必要があります。したがって、この語彙はある意味で誤解を招く可能性があり、より包括的な語彙よりも扱いやすいとされています。

公共関係のコミュニケーションとリスクコミュニケーションは、いずれも情報伝達の手段ではありますが、目的と対象は異なります。

公共関係のコミュニケーションは、組織のイメージを形成し維持し、そのメッセージを大衆や特定のステークホルダーに伝えることを重視しています。公共関係の活動は、プレスリリースの作成、メディア関係の管理、イベントの企画、企業の社会的責任の実行など、組織の評判向上を目指す多岐に渡る活動を含みます。しかし、公共関係のコミュニケーションは、情報を「スピン」する(つまり、特定の視点や解釈を強調する)ことで批判を受けることがあります。

一方で、リスクコミュニケーションは、特定のリスクについての情報を明確に伝えることに焦点を当てています。これは、人々が自身の健康、安全、環境に影響を及ぼす可能性のあるリスクについて、適切な意思決定を行うための情報を必要とする状況で使用されます。リスクコミュニケーションは、情報を「スピン」することなく、事実とデータに基づいて正確な情報を提供することにコミットメントを持っています。

したがって、公共関係のコミュニケーションとリスクコミュニケーションの主な違いは、前者が組織のイメージと評判の形成・維持に焦点を当てているのに対し、後者がリスクに関する正確で明確な情報を提供することに焦点を当てている点にあります。

スリーマイル島の事例

スリーマイル島の事例は、アメリカの原子力発電所で発生した重大な事故です。1979年3月28日、ペンシルベニア州のスリーマイル島原子力発電所で、冷却装置の故障が原因で部分的な炉心溶融が発生しました。これは、原子炉の心臓部である「炉心」が高温化し、制御不能に陥る現象で、原子力事故の中でも最も危険な状態の一つです。

この事故は、事故の発生からその後の対応に至るまで、多くの問題を浮き彫りにしました。特に、原子力関連のリスクコミュニケーションが適切に行われなかったことが大きな問題となりました。

具体的には、事故が発生した際の初期対応が遅れ、住民への適切な情報提供がなされなかったこと、さらには、事故の重大性を低く見積もるなどの誤った情報が流れたことなどが指摘されています。

これらの結果、住民は混乱と不安に陥り、信頼の喪失、パニックの発生、健康への懸念、避難の混乱など、多くの問題が発生しました。

この事例は、リスクと利益についての情報を適切に伝達することの重要性、そしてその際に科学的な根拠に基づいた正確な情報を提供することの重要性を改めて浮き彫りにしました。

スリーマイル島の事例について詳しく記述された文献としては、次のようなものがあります:
1. Walker, J. Samuel. “Three Mile Island: A Nuclear Crisis in Historical Perspective.” University of California Press, 2004.
この書籍では、スリーマイル島の事故がどのように発生し、それがどのように対応されたかについて詳しく記述されています。

2. “The Three Mile Island Nuclear Accident: Lessons and Implications.” Annals of the New York Academy of Sciences, 1981. この論文では、スリーマイル島の事故から得られた教訓とその意味するところについて詳しく議論されています。

これらの文献は、スリーマイル島の事例についての詳細な情報と、その事例から得られる科学的な洞察を提供しています。ただし、直接アクセスするためには購入やサブスクリプションが必要な場合があります。

vioxxの事例

Vioxx(一般名:ロフェコキシブ)は、メルク社が製造販売していた非ステロイド性抗炎症薬(NSAID)で、関節炎や急性疼痛の治療に使用されていました。Vioxxは、2004年に心臓発作や脳卒中のリスクを高める可能性があるという証拠が明らかになったため、世界中で市場から引き揚げられました。この事件は、薬のリスクと利益に関する情報の透明性と、製薬企業と規制当局の役割についての広範な議論を引き起こしました。

リスクコミュニケーションの目標

“Communicating Risks and Benefits: An Evidence-Based User’s Guide” 第2章では、リスクメッセージが単に情報を共有するためだけでなく、人々の信念や行動を変えることを目指すべきだと強調しています。リスクコミュニケーションのプランニング専門家は、達成したい結果を最初に考え、それらの特定の結果がリソースに合わせて目標を洗練することを提案します。

  1. 情報の共有:リスクコミュニケーションの最も基本的な目標は、リスク情報を伝達することです。これは、人々が何をすべきかについての明確なメッセージを提供することや、情報を瞬時に理解できる形で提供することを必ずしも求めているわけではありません。
  2. 信念の変化:リスクコミュニケーションの次の目標は、人々の知識や信念を変革することです。これは新しい事実を理解することや、リスクに対する認識を変えることを意味します。
  3. 行動の変化:最も高度なリスクコミュニケーションの目標は、人々の行動を変えることです。これはリスクに対する理解を深めるだけでなく、その理解を基に具体的な行動を起こすことを推奨することを指します。

これらの目標は、リスクコミュニケーションの取り組みが何を達成しようとしているのか、そしてそれがどのように評価されるべきかを明らかにするための重要なガイドラインとなります。

第3章「Evaluation」では、コミュニケーションの評価の重要性とその方法について説明しています。形成的評価(コミュニケーションが開発される段階で行われる)、プロセス評価(コミュニケーションがどの程度効果的に配信されたかを評価する)、そして結果評価(コミュニケーションがその目標を達成したかどうかを決定する)という3つの主要な評価方法があります。

  1. 形成的評価:これはコミュニケーションが開発される段階で実施され、最適な内容、形式、配信チャネルを特定するための有用な手法です。
  2. プロセス評価:これはコミュニケーションがどれだけ効果的に配信されたかを評価するもので、リーチ、一貫性、実施などの要素が考慮されます。
  3. 結果評価:これはコミュニケーションがその目標を達成したかどうかを判断するためのもので、リスク認識の変化、行動の変化、またはその他の具体的な成果を測定します。

これらの評価は、コミュニケーションの開発から実施までの各段階で行われ、その効果を最大化するためのフィードバックと改善の機会を提供します。リスクコミュニケーションの目標設定は、達成を目指す具体的な成果に基づいて行われます。

トラストセンターの設定 Microsoft Access

こんにちは、皆さん!今日はMicrosoft Accessを使っている際に遭遇するかもしれない一般的な問題とその解決策についてお話しします

特に、他のPCで作成されたAccessファイルを開いたときに表示される「このファイル内のアクティブなコンテンツはブロックされています」というメッセージに焦点を当てます

Access 2019 でトラストセンターの設定を行うには、次の手順に従います。

  • Accessを開きます:まず、Accessを開いて左上の「ファイル」ボタンをクリックします
  • オプションに進む:メニューリストの最下段にある「オプション」ボタンをクリックして、「Accessのオプション」画面を開きます
  • トラストセンターを選択:画面左側のメニューリストから「トラストセンター」を選択し、「トラストセンターの設定」ボタンをクリックします
  • マクロの設定を変更:トラストセンターの設定画面で、通常は「警告を表示してすべてのマクロを無効にする」にチェックが入っています。これを「すべてのマクロを有効にする」に変更し、「OK」ボタンを押します

これで、他のPCで作成されたファイルも問題なく開けるようになります。ただし、マクロを有効にすることはセキュリティリスクを伴うこともあるため、信頼できるファイルのみこの設定を適用することをお勧めします。

皆さんがこの情報を役立てて、よりスムーズにAccessを使用できることを願っています。何か質問があれば、いつでもコメントでお知らせくださいね!それでは、次回のブログでお会いしましょう!

AI 生成画像


こんにちは、皆さん!今日はちょっとした実験のお話をシェアしたいと思います。最近、このブログの記事を書くのに、AI技術を活用しているんですよ。具体的には、文章作成には「ChatGPT」を、アイキャッチ画像には「DALL-E」を使って、ネコの画像を生成しています。

「ChatGPT」とは、テキストベースの対話を生成するAIで、私がアイデアを投げかけると、それに基づいて記事を書いてくれるんです。一方、「DALL-E」は画像生成AIで、指定したテーマや内容に基づいて画像を作成してくれます。このブログでは特にネコの画像をよく使っているので、DALL-Eには大活躍してもらっています。

しかし、今日はちょっと違う方法を試してみました。新しいAIツール「Adobe Firefly」を使って、ネコの画像を生成してみたんです。Adobe Fireflyは、最近話題のクリエイティブな作業を支援するツールで、画像生成にも使えるんですよ。

結果はどうだったかというと、正直なところ、ちょっと印象が違っていました。DALL-Eで生成したネコの画像には慣れていたせいか、Fireflyで作った画像は新鮮ではあったものの、このブログの雰囲気には少し合わないなと感じたんです。そのため、今回は不採用という判断をしました。(下図)

AI技術は日々進化していて、色々なツールが登場しています。それぞれに特色があるので、使い分けながら最適なものを選んでいくのが楽しいですね。今後も新しいツールが出たら試して、その結果を皆さんにシェアしていきたいと思います。

それでは、今日はこの辺で。次回のブログでまたお会いしましょう!

Academic blogger’s toolkit 文献入力の画面が消えた

こんにちは、皆さん!今日は、私が長年愛用しているブログ用ツール「Academic Blogger’s Toolkit」についてお話しします。このツールは、特に学術的な内容を扱うブロガーにとって非常に便利なプラグインです。

Academic Blogger’s Toolkitとは?

このプラグインは、主に文献管理を目的として使用されています。以前は「Endnote」というツールを使っていたのですが、Academic Blogger’s Toolkitはそれの簡易版として機能します。論文を書く際には引用文献が必要不可欠ですが、文献の番号を振り直す作業は非常に手間がかかります。しかし、このツールは文献の番号を自動で振り直してくれるため、大変重宝しています。

使い心地と機能

Academic Blogger’s Toolkitはシンプルで使いやすいのが特徴です。しかし、ある時期から文献を入力する画面が表示されなくなってしまいました。原因は、使用しているサーバーのPHPバージョンが古く、プラグインのアップデートができなかったからです。今年に入ってからPHPがアップデートされたのを機に、プラグインもアップデートしましたが、残念ながら問題は解決しませんでした。ほかのcitation/bibliography管理ツールに切り替えるか迷ったのですが、このacademic blogger’s toolkitでcirculation​1​, JAMA oncology​2​, New Engl J Med​3​といった雑誌への投稿も準備してきたこともあって愛着があります。

解決策

他のツールへの切り替えも考えましたが、このツールには特別な愛着があります。そこで、いくつかのプラグインを外して試行錯誤した結果、ついに解決策を見つけました。なんと、「Classic Editor」プラグインを外すことで、文献入力画面が再び表示されるようになったのです!

まとめ

Academic Blogger’s Toolkitは、学術ブログを運営する上で非常に役立つツールです。もし同じような問題に直面している方がいれば、プラグインの設定を見直してみることをお勧めします。時にはシンプルな解決策が最も効果的かもしれませんね。

このツールによって、多くの学術雑誌への投稿準備もスムーズに行えています。今後もこの便利なツールを活用して、質の高いコンテンツを提供していきたいと思います。それでは、また次回のブログでお会いしましょう!

References

  1. Oshima Y, Tanimoto T, Yuji K, Tojo A. Association Between Aortic Dissection and Systemic Exposure of Vascular Endothelial Growth Factor Pathway Inhibitors in the Japanese Adverse Drug Event Report Database. Circulation. 2017;135(8):815-817. doi:10.1161/CIRCULATIONAHA.116.025144
  2. Oshima Y, Tanimoto T, Yuji K, Tojo A. EGFR-TKI-Associated Interstitial Pneumonitis in Nivolumab-Treated Patients With Non-Small Cell Lung Cancer. JAMA Oncol. 2018;4(8):1112-1115. doi:10.1001/jamaoncol.2017.4526
  3. Oshima Y, Yuji K, Tojo A. Eltrombopag in refractory aplastic anemia. N Engl J Med. 2012;367(12):1162; author reply 1163. doi:10.1056/NEJMc1209254

R summary tools

R summary tools

はじめに

R summary toolsを使ってみました。データフレームのデータを簡単にサマライズしてくれます。

Rスクリプトです

library(survival) #このパッケージに付属する lung というデータのサマリーを作成します
library(summarytools)


dfs <- summarytools::dfSummary(lung, max.distinct.values = 10) 
summarytools::view(dfs)

#### 結果のdfsと言うデータフレームを保存する必要なければパイプで表示に送って
summarytools::dfSummary(lung, max.distinct.values = 10) %>%
   summarytools::view()

 

解説です

このRスクリプトは、’survival’と’summarytools’という2つのライブラリを使って、’lung’というデータセットの概要を表示し、その概要を’dfs’というデータフレームに保存しています。 まず、’library(survival)’と’library(summarytools)’は、それぞれ’survival’と’summarytools’というライブラリを読み込むコマンドです。これらのライブラリは事前にインストールされている必要があります。 次に、’summarytools::dfSummary(lung, max.distinct.values = 10)’は、’lung’というデータセットの要約統計量を計算し、その結果をデータフレーム形式で返します。’max.distinct.values = 10’というオプションは、各列の異なる値が10以下の場合にはすべて表示し、それ以上の場合には最も頻繁に現れる10個の値のみ表示するという意味です。 このデータフレームは’dfs’という名前で保存され、’summarytools::view(dfs)’によって表示されます。 また、’summarytools::dfSummary(lung, max.distinct.values = 10) %>% summarytools::view()’という部分は、上記の2つの操作を1行で行うための別の書き方です。’%>%’はパイプ演算子と呼ばれ、左側の結果を右側の関数に渡します。この場合、’summarytools::dfSummary(lung, max.distinct.values = 10)’の結果が直接’summarytools::view()’に渡されて表示されます。

結果です

R CMPRSK パッケージ

CMPRSKパッケージとは

{cmprsk} は、競合リスクイベントのある生存時間分析を実施するためのRパッケージです1。具体的には、次の3つの機能を持っています:

  1. 群間の累積発生関数 (Cumulative Incidence Function; CIF) の同等性の比較検定 (Gray’s test): 異なる群の間でCIFの同等性を比較します。
  2. 推定されたCIFを表として出力する機能: 群ごとに推定されたCIFを表形式で表示します。
  3. 推定されたCIFをグラフとして出力する機能: 群ごとに推定されたCIFをグラフで視覚化します。

このパッケージは、Luca Scrucca氏による{cmprsk}パッケージに基づくラッパー関数であり、詳細な解説は本人のサイトで提供されています1

使用法と主な引数は以下の通りです:

  • ftime: 生存期間 (failure time variable)
  • fstatus: 発生したイベントを示すコード (variable with distinct codes for different causes of failure and also a distinct code for censored observations)
  • group: 比較する群を指定するコード (estimates will be calculated within groups given by distinct values of this variable)
  • t: CIFを評価する時点を指定するベクトル (a vector of time points where the cumulative incidence function should be evaluated)
  • strata: 層別化して検定を実施したい場合に指定する、層を示す変数 (stratification variable)
  • その他のオプション引数: rho, cencode, subset, na.action, level, xlab, ylab, col, lty, lwd, digits など

このパッケージを使って、競合リスクイベントのある生存時間データを効果的に分析できます

スクリプト

 

library(cmprsk)

# Fits the ’proportional subdistribution hazards’ regression model described in Fine and Gray (1999).
# This model directly assesses the effect of covariates on the subdistribution of a particular type of
# failure in a competing risks setting. The method implemented here is described in the paper as the
# weighted estimating equation.
# While the use of model formulas is not supported, the model.matrix function can be used to gener-
#   ate suitable matrices of covariates from factors, eg model.matrix(~factor1+factor2)[,-1] will
# generate the variables for the factor coding of the factors factor1 and factor2. The final [,-1]
# removes the constant term from the output of model.matrix.
# The basic model assumes the subdistribution with covariates z is a constant shift on the complemen-
#   tary log log scale from a baseline subdistribution function. This can be generalized by including
# interactions of z with functions of time to allow the magnitude of the shift to change with follow-up
# time, through the cov2 and tfs arguments. For example, if z is a vector of covariate values, and uft is
# a vector containing the unique failure times for failures of the type of interest (sorted in ascending
#                                                                                    order), then the coefficients a, b and c in the quadratic (in time) model az + bzt + zt2 can be fit by
# specifying cov1=z, cov2=cbind(z,z), tf=function(uft) cbind(uft,uft*uft).
# This function uses an estimate of the survivor function of the censoring distribution to reweight
# contributions to the risk sets for failures from competing causes. In a generalization of the method-
#   ology in the paper, the censoring distribution can be estimated separately within strata defined by
# the cengroup argument. If the censoring distribution is different within groups defined by covari-
#   ates in the model, then validity of the method requires using separate estimates of the censoring
# distribution within those groups.
# The residuals returned are analogous to the Schoenfeld residuals in ordinary survival models. Plot-
#   ting the jth column of res against the vector of unique failure times checks for lack of fit over time
# in the corresponding covariate (column of cov1).
# If variance=FALSE, then some of the functionality in summary.crr and print.crr will be lost.
# This option can be useful in situations where crr is called repeatedly for point estimates, but standard
# errors are not required, such as in some approaches to stepwise model selection.

# simulated data to test
set.seed(10)
ftime <- rexp(200)
fstatus <- sample(0:2,200,replace=TRUE)
cov <- matrix(runif(600),nrow=200)
dimnames(cov)[[2]] <- c('x1','x2','x3')
print(z <- crr(ftime,fstatus,cov))
summary(z)
z.p <- predict(z,rbind(c(.1,.5,.8),c(.1,.5,.2)))
plot(z.p,lty=1,color=2:3)
crr(ftime,fstatus,cov,failcode=2)
# quadratic in time for first cov
crr(ftime,fstatus,cov,cbind(cov[,1],cov[,1]),function(Uft) cbind(Uft,Uft^2))
#additional examples in test.R

 

以下にスクリプトの機能とそれぞれの部分の説明を提供します。

  1. ライブラリの読み込み:
    • library(cmprsk): {cmprsk}パッケージを読み込みます。
  2. シミュレートされたデータの作成:
    • set.seed(10): 乱数生成のシードを設定します。
    • ftime <- rexp(200): 200個の指数分布からなる生存時間データを生成します。
    • fstatus <- sample(0:2,200,replace=TRUE): 200個のランダムなイベントコード(0, 1, 2)を生成します。
    • cov <- matrix(runif(600),nrow=200): 200行3列の乱数行列を生成します。
    • dimnames(cov)[[2]] <- c('x1','x2','x3'): 列名を ‘x1’, ‘x2’, ‘x3’ に設定します。
  3. crr関数を使用して競合リスクイベントのある生存時間データを分析:
    • z <- crr(ftime,fstatus,cov): 群間の累積発生関数(CIF)の同等性を比較し、推定されたCIFを表として出力します。
    • summary(z): 分析結果のサマリーを表示します。
    • z.p <- predict(z,rbind(c(.1,.5,.8),c(.1,.5,.2))): 推定されたCIFを指定した時点で計算し、結果を表示します。
    • plot(z.p,lty=1,color=2:3): 推定されたCIFをグラフで表示します。
    • crr(ftime,fstatus,cov,failcode=2): 特定の失敗コードを持つデータを用いて再度分析を実行します。
    • crr(ftime,fstatus,cov,cbind(cov[,1],cov[,1]),function(Uft) cbind(Uft,Uft^2)): 最初の共変量に対して時間の2次項を考慮した分析を実行します。
  4. 追加の例:
    • test.Rファイルにさらなる例が含まれています。

このスクリプトは、競合リスクイベントのある生存時間データの解析に役立ちます。詳細な使い方やパラメータの調整については、{cmprsk}パッケージのドキュメントや解説を参照してください 123

 

# 実行結果
> print(z <- crr(ftime,fstatus,cov))
convergence:  TRUE 
coefficients:
      x1       x2       x3 
 0.26680 -0.05568  0.28050 
standard errors:
[1] 0.4211 0.3812 0.3810
two-sided p-values:
  x1   x2   x3 
0.53 0.88 0.46 
> summary(z)
Competing Risks Regression

Call:
crr(ftime = ftime, fstatus = fstatus, cov1 = cov)

      coef exp(coef) se(coef)      z p-value
x1  0.2668     1.306    0.421  0.633    0.53
x2 -0.0557     0.946    0.381 -0.146    0.88
x3  0.2805     1.324    0.381  0.736    0.46

   exp(coef) exp(-coef)  2.5% 97.5%
x1     1.306      0.766 0.572  2.98
x2     0.946      1.057 0.448  2.00
x3     1.324      0.755 0.627  2.79

Num. cases = 200
Pseudo Log-likelihood = -320 
Pseudo likelihood ratio test = 1.02  on 3 df,
> z.p <- predict(z,rbind(c(.1,.5,.8),c(.1,.5,.2)))
> plot(z.p,lty=1,color=2:3)
> crr(ftime,fstatus,cov,failcode=2)
convergence:  TRUE 
coefficients:
      x1       x2       x3 
-0.31390 -0.03488 -0.52500 
standard errors:
[1] 0.4517 0.4475 0.4675
two-sided p-values:
  x1   x2   x3 
0.49 0.94 0.26 
> # quadratic in time for first cov
> crr(ftime,fstatus,cov,cbind(cov[,1],cov[,1]),function(Uft) cbind(Uft,Uft^2))
convergence:  TRUE 
coefficients:
                            x1                             x2                             x3 
                       2.16500                       -0.06664                        0.27490 
cbind(cov[, 1], cov[, 1])1*Uft cbind(cov[, 1], cov[, 1])2*tf2 
                      -3.25200                        0.81900 
standard errors:
[1] 0.9464 0.3797 0.3854 1.2590 0.2925
two-sided p-values:
                            x1                             x2                             x3 
                        0.0220                         0.8600                         0.4800 
cbind(cov[, 1], cov[, 1])1*Uft cbind(cov[, 1], cov[, 1])2*tf2 
                        0.0098                         0.0051

次に、Rの cmprsk パッケージを使用して、競合リスク(competing risks)の累積発生率を比較するための解析を行っています。

############################
set.seed(2)
ss <- rexp(100)
gg <- factor(sample(1:3,100,replace=TRUE),1:3,c('a','b','c'))
cc <- sample(0:2,100,replace=TRUE)
strt <- sample(1:2,100,replace=TRUE)
print(xx <- cuminc(ss,cc,gg,strt))
plot(xx,lty=1,color=1:6)
# see also test.R, test.out

具体的には、次の手順を実行しています:

  1. データの生成:
    • set.seed(2) で乱数のシードを設定しています。
    • rexp(100) で指数分布に従うランダムなイベント時間を生成しています。
    • sample(1:3, 100, replace=TRUE) でランダムなイベントの状態(3つのグループ ‘a’, ‘b’, ‘c’)を生成しています。
    • sample(0:2, 100, replace=TRUE) でランダムな検閲状態(0, 1, 2)を生成しています。
    • sample(1:2, 100, replace=TRUE) でランダムな開始時点を生成しています。
  2. cuminc 関数の実行:
    • cuminc(ss, cc, gg, strt) で競合リスクの累積発生率を計算しています。ss はイベント時間、cc はイベントの状態、gg はグループ、strt は開始時点です。
  3. 結果の表示:
    • print(xx) で計算された累積発生率を表示しています。
  4. グラフの描画:
    • plot(xx, lty=1, color=1:6) で累積発生率のグラフを描画しています。

############################
set.seed(2)
ss <- rexp(100)
gg <- factor(sample(1:3,100,replace=TRUE),1:3,c(‘a’,’b’,’c’))
cc <- sample(0:2,100,replace=TRUE)
strt <- sample(1:2,100,replace=TRUE)
print(xx <- cuminc(ss,cc,gg,strt))
plot(xx,lty=1,color=1:6)
# see also test.R, test.out

############################
set.seed(2)
ss <- rexp(100)
gg <- factor(sample(1:3,100,replace=TRUE),1:3,c('a','b','c'))
cc <- sample(0:2,100,replace=TRUE)
strt <- sample(1:2,100,replace=TRUE)
print(xx <- cuminc(ss,cc,gg,strt))
plot(xx,lty=1,color=1:6)
# see also test.R, test.out

このコードは、競合リスクの解析において、各グループの累積発生率を比較するための有用な手法を示しています。12

詳細については、公式ドキュメントをご参照ください:cmprsk パッケージ1

> print(xx <- cuminc(ss,cc,gg,strt))
Tests:
      stat        pv df
1 1.598854 0.4495865  2
2 3.390543 0.1835493  2
Estimates and Variances:
$est
             1         2         3         4
a 1 0.27262599 0.3216446 0.3216446 0.3216446
b 1 0.08877315 0.3423257 0.3423257 0.3423257
c 1 0.23368736 0.4312495 0.4879272 0.4879272
a 2 0.38424403 0.5607109 0.5607109 0.5607109
b 2 0.31463271 0.4786961 0.5234407 0.5234407
c 2 0.20127996 0.3420399 0.3420399 0.3420399

$var
              1           2           3           4
a 1 0.008596053 0.009950848 0.009950848 0.009950848
b 1 0.002491270 0.009675072 0.009675072 0.009675072
c 1 0.006341967 0.011566190 0.012617195 0.012617195
a 2 0.010293273 0.022358101 0.022358101 0.022358101
b 2 0.007220502 0.010014466 0.010588994 0.010588994
c 2 0.005699657 0.010260038 0.010260038 0.010260038

 

 

R excess mortality

超過死亡率の集計

コロナ禍で超過死亡が話題になる事がありましたがどうやって計算しているのかよく知らなかったので少しひも解いてみました。参照した文献はこちら。使用したのはexcessmortパッケージです。

このパッケージにはCDCが公開する、州別で、週ごとの死亡者数の見積もり、に加えて人口の見積もり(Censusという人口統計からの変化を計算した見積もり)の情報がcdc_state_countsというデータフレームで含まれます。これを利用して、新型コロナが流行し始めた2020年以降データと、死亡の多かった2017-18のインフルエンザシーズンを除外したデータを基に、それらの死亡の影響がない場合の期待される死亡のトレンド・季節変化を計算します。そのうえで、そのモデルからの逸脱状況をプロットします。(その逸脱分が新型コロナ(と2017-18はインフルエンザ)の影響と解釈したいという仮説で集計します)

メリーランド州を選択したのは、以前住んでいたからです。

library(excessmort)
library(dplyr)
library(lubridate)
library(ggplot2)



# A list with six ggplot objects: ‘population‘ is a time series plot of the population. ‘seasonal‘ is a
# plot showing the estimated seasonal effect. ‘trend‘ is a time series plot showing the estimated trend.
# ‘weekday‘ is a plot of the estimated weekday effects if they were estimated. ‘expected‘is a time
# series plot of the expected values. ‘residual‘ is a time series plot of the residuals.

flu_season <- seq(make_date(2017, 12, 16), make_date(2018, 1, 16), by = "day")
exclude_dates <- c(flu_season, seq(make_date(2020, 1, 1), today(), by = "day"))
res <- cdc_state_counts %>%
  filter(state == "Maryland") %>%
  compute_expected(exclude = exclude_dates,
                   keep.components = TRUE)

p <- expected_diagnostic(expected = res, alpha = 0.50)
p$population
p$seasonal
p$trend
p$expected
p$residual

 

このRのコードは、統計解析のために使用されるパッケージや関数を活用しています。以下に、コードの動作をプログラム初心者向けに説明します。

  1. ライブラリの読み込み:
    • excessmort, dplyr, lubridate, および ggplot2というライブラリを読み込んでいます。これらはデータの操作、時系列解析、グラフ作成に役立ちます。
  2. データの前処理:
    • flu_seasonは2017年12月16日から2018年1月16日までの日付を生成しています。
    • exclude_datesは特定の日付範囲を除外するために使用されています。
  3. データのフィルタリングと計算:
    • cdc_state_countsから州が「Maryland」のデータを抽出しています。
    • compute_expected関数を使用して期待値を計算しています。keep.components = TRUEは成分を保持するオプションです。
  4. グラフの作成:
    • expected_diagnostic関数を使用して、期待値の診断プロットを作成しています。
    • このプロットには以下の要素が含まれています:
      • population: 人口の時系列プロット
      • seasonal: 推定された季節効果のプロット
      • trend: 推定されたトレンドの時系列プロット
      • expected: 期待値の時系列プロット
      • residual: 残差の時系列プロット

このコードは、データの前処理からグラフの作成までの一連のステップを示しています。プログラム初心者にとっては、ライブラリの読み込みやデータの操作、グラフの作成などが理解しやすいポイントです。12

  • population: 人口の時系列プロット;y軸を操作して変化がわかりやすくした図も掲載します

  • seasonal: 推定された季節効果のプロット;同上

 

  • trend: 推定されたトレンドの時系列プロット;同上

 

 

  • expected: 期待値の時系列プロット;同上

この周期性の変化のモデル(赤い線と帯)が期待値で、実際の週ごとの死亡数をプロットしたものが下図になります。

 

  • residual: 残差の時系列プロット

R epibasixを触ってみた

epibasixパッケージの関数を試して見ました

sensSpec関数

このRコードは、疫学研究において新しい検査法や自己報告を現行のゴールドスタンダードと比較する際に、感度、特異度、Youden指数、および一致率を計算するためのものです。

library(epibasix)

# This function is designed to calculate Sensitivity, Specificity, Youden’s J and Percent Agreement.
# These tools are used to assess the validity of a new instrument or self-report against the current
# gold standard. In general, self-report is less expensive, but may be subject to information bias.
# Computational formulae can be found in the reference.

dat <- cbind(c(18,1), c(19,11))
summary(sensSpec(dat))

# Szklo M and Nieto FJ. Epidemiology: Beyond the Basics, Jones and Bartlett: Boston, 2007 P.315
  • 感度 (Sensitivity): 検査法が疾患を正しく検出する能力を評価します。感度は、疾患の存在する人々のうち、検査で陽性と判定された割合を示します。
  • 特異度 (Specificity): 検査法が健康な人々を正しく陰性と判定する能力を評価します。特異度は、健康な人々のうち、検査で陰性と判定された割合を示します。
  • Youden指数 (J): Youden指数は、感度と特異度のバランスを示す指標です。Youden指数は、感度と特異度の和から1を引いた値で計算されます。Youden指数が高いほど、検査法の性能が良いことを意味します。
  • 一致率 (Percent Agreement): 現行のゴールドスタンダードと新しい検査法の結果が一致する割合を示します。一致率は、両者の結果が同じと判定された割合です。

このコードでは、epibasixパッケージを使用して、与えられたデータセットから感度、特異度、Youden指数、および一致率を計算しています。具体的な計算式は、参考文献で確認できます1

このような指標を使用することで、新しい検査法の有効性を評価し、疫学研究において適切な判断を行うことができます。

sensSpec関数の実行結果

> summary(sensSpec(dat))

 Detailed Sensitivity and Specitivity Output 
 
Input Matrix: 
           Gold Standard A Gold Standard B
Reported A              18              19
Reported B               1              11

The sample sensitivity is: 94.7% 
95% Confidence Limits for true sensitivity are: [84.7, 104.8]

The sample of specificity is: 36.7% 
95% Confidence Limits for true specificity are: [19.4, 53.9]

The sample value of Youden's J is: 31.4
95% Confidence Limits for Youden's J are: [11.4, 51.4]

Sample value for Percent Agreement (PA) is: 59.2% 
95% Confidence Limits for PA are: [45.4, 72.9]

ま、そういう事みたいです。

univar関数

このRコードは、単一の変数に対する詳細な単変量解析を提供します。具体的には、以下の統計量を計算します:

  • 平均 (mean): 観測値の平均値。
  • 中央値 (median): 観測値の中央値。
  • 標準偏差 (standard deviation): 観測値のばらつきの尺度。
  • 範囲 (range): 観測値の最小値から最大値までの幅。
  • 仮説検定と信頼区間のツール

具体的な使用方法は次の通りです:

#This function provides detailed univariate analysis for a single variable. Values include the sample
# mean, median, standard deviation and range, as well as tools for hypothesis tests and confidence
# intervals.

x <- rexp(100)
univar(x)

# Casella G and Berger RL. Statistical Inference (2nd Ed.) Duxbury: New York, 2002.

univar関数の実行結果

> x <- rexp(100)
> univar(x)

Univariate Summary
 
Sample Size: 100
Sample Mean: 0.972 
Sample Median: 0.632 
Sample Standard Deviation: 0.986 

ま、このパッケージは他のものでカバーできそうかな

 

Rで二項分布をまとめて計算

二項分布をまとめて計算

はじめに

複数の頻度と95%信頼区間を計算したい。普段、頻度とその95%信頼区間はbinom.test(a, b)を用いて計算しています。これに、データフレームのデータを流し込んで一気に、頻度 estimateと信頼区間の上限upperと下限lowerの値をベクトルとして得たい。

サンプルコード

bunsi <- c(1, 2, 3, 4)
bunbo <- c(10, 15, 16, 20)
df <- data.frame(bunsi, bunbo)

result <- mapply( binom.test, df$bunsi, df$bunbo ) 
estimates <- unlist(result[5,]) # estimate, 頻度
conf_int <- matrix ( unlist(result[4,]) , byrow=F, nrow=2 ) # conf.int
lower <- conf_int[1,]
upper <- conf_int[2,]

解説

このRスクリプトは、4つの異なる二項分布に関する二項検定を行っています。 まず、ベクトル`bunsi`と`bunbo`が定義されており、それぞれ成功回数と試行回数を表しています。

次に、これらのベクトルを使用してデータフレーム`df`が作成されます。

`mapply`関数は、`binom.test`を用いて、`df`の各行について二項検定を行います。`binom.test`は、二項分布における成功の確率を推定し、その確率が指定した値(デフォルトでは0.5)から有意に異なるかどうかを検定します。

結果のリストから、`estimates`(推定値)と`conf_int`(信頼区間)が抽出されます。`estimates`は成功の確率の推定値を、`conf_int`はその95%信頼区間を表しています。

最後に、信頼区間の下限`lower`と上限`upper`が抽出されています。 したがって、このスクリプトは4つの二項分布の成功確率を推定し、その信頼区間を計算しています。

二重ルーターになっていないか

二重ルーター

自宅のネットが遅いとき、ハブのつもりで設定している機器が複数ルーターになっていたら、それを解消するだけで良くなるかもしれません。

方法

windows 標準プログラムにある、コマンドプロンプトで次を入力します

Tracert -d 8.8.8.8

出力に以下で始まるアドレスが2つ以上あったら、家のネットにつながっている機器の設定を片端から確認しましょう。

  • 192.
  • 172.
  • 10.

「ブリッジモード」「アクセスポイントモード(APモード)」なら〇
「ルーター」なら×

 

コマンドの意味

`tracert -d 8.8.8.8`はWindowsのコマンドプロンプトで使われるコマンドです。 ここで、`tracert`は”trace route”の略で、インターネット上のルートを追跡するためのツールです。指定された宛先ホストまでのIPネットワークルートを表示します。これはパケットが送信元から宛先までどのルートをたどるかを確認するために使用されます。 `-d`オプションは、途中のルートでの名前解決を行わないことを指示します。つまり、各ホップのIPアドレスを表示しますが、それらのIPアドレスに関連するホスト名は表示しません。 `8.8.8.8`はGoogleの公開DNSサーバの一つのIPアドレスです。 したがって、`tracert -d 8.8.8.8`コマンドは、現在のマシンからGoogleのDNSサーバまでのルートを追跡し、その各ホップのIPアドレスを表示します。 ただし、今回のプロジェクトではインターネットへのアクセスを前提としたコードを生成できないため、このコマンドをプログラム内で使用することはできません。

Translate »