産後うつ病と誤診されたシーハン症候群の頻度、臨床症状、および経過

シーハン症候群は、産後うつ病に類似した精神科的症状を呈することが多く、診断の遅れが7〜15年に及ぶこともある。しかし、誤診の頻度に関する体系的なデータは存在せず、ホルモン補充療法によって症状は通常迅速に改善する。


産後うつ病に類似した精神科的症状の症例

  • 複数の症例報告およびケースシリーズ(Kaleら, 1999; Maneeshaら, 2024; Chiuら, 2021; Qadriら, 2015; de Silvaら, 2020)では、シーハン症候群が精神科的症状、特にうつ病や精神病として現れることが記述されている。
  • 一部の症例では、幻覚や妄想などの精神病症状が顕著であり(Chiuら, 2021; de Silvaら, 2020)、ホルモン補充療法によって改善した。
  • 他の症例では、うつ病症状が主な特徴であり(Maneeshaら, 2024; Qadriら, 2015)、初期には精神科的治療が行われた。
  • 不穏、恐怖感、認知障害などの行動変化も報告されている(Chiuら, 2021; Errarhayら, 2008; de Silvaら, 2020)。
  • これらの報告では、典型的な内分泌症状が欠如していたり見逃されていたりすることがあり、診断を困難にしていた。

誤診の頻度とパターン

  • シーハン症候群が産後うつ病と誤診される頻度を体系的に報告した研究は含まれていない。
  • 症例報告からの逸話的証拠(Kaleら, 1999; Maneeshaら, 2024; Chiuら, 2021; Qadriら, 2015; de Silvaら, 2020)では、精神科的症状が診断の遅れや見逃しにつながることが多いとされている。
  • より大規模な後ろ向き研究(Ramiandrasoaら, 2013; Sanyal & Raychaudhuri, 2012)は診断の遅れや初期症状に焦点を当てているが、精神科的誤診の割合については要旨に記載がなかった。
  • 症例報告から得られる証拠では、神経精神症状が主であり、典型的な内分泌症状が微妙または欠如している場合に誤診が起こる可能性があるが、体系的なデータがないため、正確な頻度の推定は困難である。

臨床経過と診断の遅れ

  • より大規模な症例集(Ramiandrasoaら, 2013; Sanyal & Raychaudhuri, 2012; Chiuら, 2021)では、平均7〜15年の診断遅延が報告されている。
  • 遅延の原因としては以下が挙げられている:
    • 非特異的な症状
    • 医師の認識不足
    • 精神科的症状を一次的な気分障害や精神病と誤認
  • 複数の症例報告(Maneeshaら, 2024; Qadriら, 2015; de Silvaら, 2020)では、患者が数年間精神科薬で治療された後に正しい診断が下された。
  • ホルモン補充療法により、精神科的および全身症状の迅速かつしばしば完全な改善が見られた(Kaleら, 1999; Chiuら, 2021; Errarhayら, 2008; de Silvaら, 2020)。

鑑別診断の手がかりとなる臨床所見

  • 授乳不能(無乳症)や無月経などの内分泌症状は、これらを記載した研究において信頼できる手がかりとされている(Ramiandrasoaら, 2013; Sanyal & Raychaudhuri, 2012; Errarhayら, 2008)。
  • その他の全身症状(甲状腺機能低下症、副腎不全、低ナトリウム血症、低血糖)は報告にばらつきがある(Ramiandrasoaら, 2013; Sanyal & Raychaudhuri, 2012; Errarhayら, 2008; de Silvaら, 2020)。
  • これらの症状が、産後出血の文脈で出現した場合、産後の精神科的症状を呈する女性に対してシーハン症候群を考慮する契機となる可能性があると示唆されている。

Study Study Design Population Primary Focus Psychiatric Manifestations Reported Full text retrieved
Kale et al., 1999 Case report 1 woman, 23 years Postpartum psychosis in Sheehan’s syndrome Postpartum – No psychosis No
Maneesha et al., 2024 Case report 1 woman, 39 years, multiparous Depression and dyselectrolytaemia in Sheehan’s syndrome Depression No
Ramiandrasoa et al., 2013 Retrospective cohort study 40 women (39 analyzed) Clinical features and diagnostic delay in Sheehan’s syndrome No mention No found
Diri et al., 2015 Review article Not applicable Epidemiology, clinical features, diagnosis, treatment of Sheehan’s syndrome No mention found No
Chiu et al., 2021 Case report and case series 1 woman, 42 years (case); 19 patients (series) Sheehan’s syndrome presenting as postpartum psychosis Behavioral changes, psychosis, depression Yes
Dejager et al., 1998 Case report No mention found Acute phase differential diagnosis in Sheehan’s syndrome No mention No found
Qadri et al., 2015 Case report 1 woman, 45 years Sheehan’s syndrome presenting as major depressive disorder Major depressive disorder No
Sanyal and Raychaudhuri, 2012 Retrospective case series 18 women, 28–71 years Presenting features of Sheehan’s syndrome at diagnosis No mention found No
Errarhay et al., 2008 Case report and literature review 1 woman, 40 years, three pregnancies, three births Sheehan’s syndrome with neuroendocrine and systemic manifestations Agitation, convulsions Yes
de Silva et al., 2020 Case report and literature review 1 woman, 32 years, third child Sheehan’s syndrome with psychotic manifestations Fearfulness, delusions, hallucinations, cognitive impairment No

References

Cynthia Ramiandrasoa, F. Castinetti, I. Raingeard, P. Fénichel, O. Chabre, T. Brue, and B. Courbière. “Delayed Di- agnosis of Sheehan’s Syndrome in a Developed Country: A Retrospective Cohort Study.” European Journal of Endocrinology, 2013.

D. Sanyal, and M. Raychaudhuri. “Varied Presentations of Sheehan’s Syndrome at Diagnosis: A Review of 18 Patients.” Indian Journal of Endocrinology and Metabolism, 2012.

H. Diri, Z. Karaca, F. Tanrıverdi, K. Unluhizarci, and F. Keleştimur. “Sheehan’s Syndrome: New Insights into an Old Disease.” Endocrine, 2015.

H. H. Chiu, E. M. Masamayor, Ma. Belen B. Pilit-Hizon, A. B. Uy, M. C. Ańonuevo-Cruz, and Gabriel Jasul. “Sheehan’s Syndrome Presenting as Postpartum Psychosis.” Acta Medica Philippina, 2021.

K. Kale, N. Nihalani, N. Karnik, and N. Shah. “POSTPARTUM PSYCHOSIS IN A CASE OF SHEEHAN’S SYNDROME.” Indian Journal of Psychiatry, 1999.

M. Maneesha, KS Chenthil, Vignessh Raveekumaran, and J. F. Mary. “A Rare Case of Sheehan’s Syndrome Presenting as Depression and Dyselectrolytaemia in a Multiparous Woman.” Journal of Clinical and Diagnostic Research, 2024.

Mehmood Qadri, M. Mushtaq, I. Qazi, S. Yousuf, and A. Rashid. “Sheehan’s Syndrome Presenting as Major Depressive Disorder.” Iranian Journal of Medical Sciences, 2015.

N. D. de Silva, J. Galhenage, M. Dayabandara, and N. Somasundaram. “Sheehan Syndrome Presenting with Psychotic Manifestations Mimicking Schizophrenia in a Young Female: A Case Report and Review of the Literature.” Case Reports in Endocrinology, 2020.

S. Dejager, S. Gerber, L. Foubert, and G. Turpin. “Sheehan’s Syndrome: Differential Diagnosis in the Acute Phase.” Journal of Internal Medicine, 1998.

S. Errarhay, I. Kamaoui, C. Bouchikhi, H. Chaara, Hakima Bouguern, S. Tizniti, A. Melhouf, and A. Banani. “Sheehan’s Syndrome A Case Report and Literature Review.” Libyan Journal of Medicine, 2008.

Rでデータ整理

上のようなデータがあったとして、dplyrで少し成形します

  1. filter() … 行の選択
  2. arrange() … 行の並び替え
  3. select() … 指定した列のみ選択
  4. mutate() … 新しい列の追加
  5. group_by() … グルーピング
  6. summarize() … 集計

 

tidyverse のフィルターを使って

library(tidyverse)
library(readxl)
library(dplyr)

df <- read_xlsx("0050 irAE.xlsx")

df %>%  
  filter(ir_AE == -1) %>% # ir_AE が-1(TRUEを-1で入力してある)の行のみ選択
  arrange(Time2Onset) %>% # Time2Onsetの順に並べ替え(この後平均を取るので意味なし😛)
  group_by(`医薬品(一般名)`, irAE ) %>% # 医薬品およびirAEごとにグループ化
  summarise(avTO = mean(Time2Onset))  -> newDF # 医薬品・irAE毎のTime2Onset平均値を計算して、newDFというデータフレームへ書き出す

以下のような出力になりました

 

解説

このRスクリプトは、指定されたExcelファイルからデータを読み込み、特定の条件に基づいてデータをフィルタリング、並べ替え、グループ化し、平均値を計算します。

まず、”tidyverse”と”readxl”、”dplyr”という3つのRパッケージを読み込みます。

次に、read_xlsx関数を使用して、指定されたExcelファイル(“0050 irAE.xlsx”)からデータを読み込み、dfという名前のデータフレームに格納します。

その後、dfデータフレームを使用して、ir_AE列が-1(TRUEを-1で入力してある)の行のみを選択します。さらに、Time2Onset列の値を基準に昇順に並べ替えます(ただし、この後の平均値の計算には影響しません)。

次に、医薬品(一般名)とirAEの値を基準にグループ化し、それぞれのグループごとにTime2Onsetの平均値を計算します。計算結果は、”医薬品(一般名)”と”irAE”、”avTO”という列名を持つ新しいデータフレームnewDFに格納されます。

以上が、このRスクリプトの動作です。

便利そうなサイト

フリー写真素材の検索

O-DAN (オーダン)- 無料写真素材・フリーフォト検索

日本語で検索出来て、キーワードに沿ったフリーの写真を提示してくれます。

写真をクリックしたら、フリー素材提供元のサイトへ飛びます。

 

セキュリティチェックサイト

URL(リンク・サイト・ホームページ)の安全・危険、リンクスパム・ウイルスや詐欺フィッシングをチェック、短縮URLの展開・解析、サイトキャプチャ取得も可能。 (securl.nu)

接続する前に安全性をチェック

 

捨てアドサイト

ワンクリックでアドレス発行!「ワンタイムメール」 (onetime-mail.com)

一時的に利用したいメールアドレスをweb上で作成できるサイト

1週間使用できるアドレスが生成されて、当該ページでメールを見ることができます。

 

昔のWebサイトの魚拓

Internet Archive: Wayback Machine

 

 

 

 

WAVLINK AC1200取説

WAVLINK AC1200という、安価な無線ルーターを使用しています。

少し電力消費が多そう(熱くなる)ので経済的でないかもしれませんが、かなり昔ですが安かったのでポチッとしました。

これを中継機として使用するにあたって、説明書がなくて困りました。ネットで調べたリンクを貼っておきます。

とりあえず、ログインするには、こいつのwifi電波に接続した上で 192.168.10.1 へ接続し、パスワードadmin (当然私はもう変更しています)で設定画面に入れます。

backup

R ggplot で複数のデータフレームを結合して描画

はじめに

こんな感じのデータがありました

xは時期 as.Date(“2024-03-08”)とかの値が入っているベクター

cancer はc(“GC”, “BC”) がん種の値が入ったベクター

y は表示したい値(平均値とか頻度とか)

low/hight はエラーバーの上限・下限(95%信頼区間とか)

何がしたいのか

データフレームをがん種別に作成した後に、それらを一つのグラフで表示したくなった

library(ggplot2)
library(ggsci)
library(scales)

BC_data_frame <- data.frame(x, cancer, y, low, high) # BCとGCでそれぞれのベクターには
GC_data_frame <- data.frame(x, cancer, y, low, high) # 異なる値が入っている

combined_data_frame <- rbind(BC_data_frame, GC_data_frame)

g5 <- ggplot(combined_data_frame, aes(x, y, color = cancer)) + 
   geom_smooth(aes(ymin = low, ymax = high), alpha = 0.2) + 
   scale_color_nejm() + 
   geom_point() + 
   geom_errorbar(aes(ymin = low, ymax = high), width = 10) + 
   scale_x_date(limits = c(as.Date("2020-05-15"), as.Date("2024-01-31")), oob = oob_keep) +
   scale_y_continuous(limits = c(0, 0.2), oob = oob_keep)
plot(g5)
ど

どうしたらどうなった

rbindで結合して、そのままプロットしたら2系列が分かれて表示された

全体はこんな感じ

setwd("C:/Users/****")

library(ggplot2)
library(ggsci)
library(scales)

x <- seq(as.Date("2020-06-01"), as.Date("2024-01-01"), by = "month")
k1 <-  binom.test(1, 11);	y <- c(k1$estimate);	low <- c(k1$conf.int[1]);	high <- c(k1$conf.int[2])
k2 <-  binom.test(1, 19);	y <- c(y, k2$estimate);	low <- c(low, k2$conf.int[1]);	high <- c(high, k2$conf.int[2])
# ... データ個所は中略
k43 <- binom.test(12, 135);	y <- c(y, k43$estimate);	low <- c(low, k43$conf.int[1]);	high <- c(high, k43$conf.int[2])
k44 <- binom.test(11, 131);	y <- c(y, k44$estimate);	low <- c(low, k44$conf.int[1]);	high <- c(high, k44$conf.int[2])
cancer <- rep("GC", 44)
GC_data_frame <- data.frame(x, cancer, y, low, high)

k1 <-  binom.test(0, 12);	y <- c(k1$estimate);	low <- c(k1$conf.int[1]);	high <- c(k1$conf.int[2])
k2 <-  binom.test(0, 118);	y <- c(y, k2$estimate);	low <- c(low, k2$conf.int[1]);	high <- c(high, k2$conf.int[2])
# ... データ個所は中略
k43 <- binom.test(2, 302);	y <- c(y, k43$estimate);	low <- c(low, k43$conf.int[1]);	high <- c(high, k43$conf.int[2])
k44 <- binom.test(3, 279);	y <- c(y, k44$estimate);	low <- c(low, k44$conf.int[1]);	high <- c(high, k44$conf.int[2])
cancer <- rep("BC", 44)
BC_data_frame <- data.frame(x, cancer, y, low, high)

combined_data_frame <- rbind(BC_data_frame, GC_data_frame)

g5 <- ggplot(combined_data_frame, aes(x, y, color = cancer)) + 
  geom_smooth(aes(ymin = low, ymax = high), alpha = 0.2) + 
  labs (title = "xxxxx in GC/BC") + 
  labs(subtitle = "xxxxx") +
  labs(    x        = "Calendar time",
           y        = "Proportion of report per exposure",
           caption  = "Error bars indicate 95% confidence interval calculated with Clopper and Pearson's method" ) +
  scale_color_nejm() + 
  geom_point() + 
  geom_errorbar(aes(ymin = low, ymax = high), width = 10) + 
  scale_x_date(limits = c(as.Date("2020-09-15"), as.Date("2024-02-01")), oob = oob_keep) + 
  scale_y_continuous(limits = c(0, 0.3), oob = oob_keep)
plot(g5)

 

 

 

R sqlが no such tableとエラーを返してきた

R でdata frameに対してsql スクリプトを実行できるパッケージのsqldfで、存在しているはずのデータフレームを指定しても’no such table’というエラーが返ってきました

関連するパッケージを最新バージョンへアップデートしたり、Rを再起動したりしたのですが効果はありませんでした。どうやらデータフレーム名に.(ドット)があるとダメなようです。

以下の試行例では、df_LineListではエラーが出ませんがdf.LineListではエラーになってしまいます

> df.LineList <- df_LineList # データフレームの内容は同じ
> df.test <- sqldf('SELECT * FROM df_LineList') # エラーなし
> df.test <- sqldf('SELECT * FROM df.LineList') # こちらではエラーが出る
 エラー: no such table: df.LineList

> class(df.LineList)
[1] "tbl_df"     "tbl"        "data.frame"
> class(df_LineList)
[1] "tbl_df"     "tbl"        "data.frame"
>

 

 

R 確率密度関数と分布母数の推定

はじめに

手持ちの単変量の分布を確率密度関数に当てはめて母数を推定する(よくわからない)

使うデータは他のページで作成したdf.testDATA

スクリプト

library(fitdistrplus)
# 分布のテスト
x <- df.testDATA$Time2Onset
y <- max(df.testDATA$Time2Onset)
min(df.testDATA$Time2Onset)
################ distribution test ################ 

normmlefit <- fitdist(x, "norm", "mle"); fit <- normmlefit; gofstat(fit); plot(fit)
lnormmlefit <- fitdist(x + 0.1, "lnorm", "mle"); fit <- lnormmlefit; gofstat(fit); plot(fit)
poismlefit <- fitdist(x, "pois", "mle"); fit <- poismlefit; gofstat(fit); plot(fit)
expmlefit <- fitdist(x, "exp", "mle"); fit <- expmlefit; gofstat(fit); plot(fit)
gammammefit <- fitdist(x, "gamma", "mme"); fit <- gammamlefit; gofstat(fit); plot(fit)
nbinommlefit <- fitdist(x, "nbinom", "mle"); fit <- nbinommlefit; gofstat(fit); plot(fit)
geommlefit <- fitdist(x, "geom", "mle"); fit <- geommlefit; gofstat(fit); plot(fit)
betammefit <- fitdist(x/y, "beta", "mme"); fit <- betamlefit; gofstat(fit); plot(fit)
unifmlefit <- fitdist(x, "unif", "mle"); fit <- unifmlefit; gofstat(fit); plot(fit)
logismlefit <- fitdist(x, "logis", "mle"); fit <- logismlefit; gofstat(fit); plot(fit)

結果

よくフィットしてそうなのはbetaかgammaの様です

ロジスティック分布

Fitting of the distribution ' logis ' by maximum likelihood 
Parameters : 
         estimate Std. Error
location 58.31789   2.418478
scale    45.17608   1.249104
Loglikelihood:  -5863.559   AIC:  11731.12   BIC:  11740.93 
Correlation matrix:
          location     scale
location 1.0000000 0.1570439
scale    0.1570439 1.0000000

一様の分布(定数)

Fitting of the distribution ' unif ' by maximum likelihood 
Parameters : 
    estimate Std. Error
min        0         NA
max      682         NA
Loglikelihood:  -6525.03   AIC:  13054.06   BIC:  13063.87 
Correlation matrix:
[1] NA

beta分布

Fitting of the distribution ' beta ' by matching moments 
Parameters : 
        estimate
shape1 0.4604008
shape2 3.6574364
Loglikelihood:  NaN   AIC:  NaN   BIC:  NaN

geom分布

Fitting of the distribution ' geom ' by maximum likelihood 
Parameters : 
       estimate   Std. Error
prob 0.01294465 0.0004042749
Loglikelihood:  -5340.572   AIC:  10683.14   BIC:  10688.05

 

負の二項分布

Fitting of the distribution ' nbinom ' by maximum likelihood 
Parameters : 
       estimate Std. Error
size  0.7293184 0.02936535
mu   76.2394754 2.83607459
Loglikelihood:  -5307.489   AIC:  10618.98   BIC:  10628.79 
Correlation matrix:
             size           mu
size 1.0000000000 0.0001760878
mu   0.0001760878 1.0000000000

 

gamma分布

Fitting of the distribution ' gamma ' by matching moments 
Parameters : 
         estimate
shape 0.644237078
rate  0.008448789
Loglikelihood:  Inf   AIC:  -Inf   BIC:  -Inf

 

指数分布

Fitting of the distribution ' exp ' by maximum likelihood 
Parameters : 
       estimate   Std. Error
rate 0.01311441 0.0004122862
Loglikelihood:  -5334.044   AIC:  10670.09   BIC:  10675

 

ポワソン分布

Fitting of the distribution ' pois ' by maximum likelihood 
Parameters : 
       estimate Std. Error
lambda   76.252  0.2761377
Loglikelihood:  -48448.44   AIC:  96898.87   BIC:  96903.78

 

対数正規分布

Fitting of the distribution ' lnorm ' by maximum likelihood 
Parameters : 
        estimate Std. Error
meanlog 3.477753 0.05160282
sdlog   1.631824 0.03648864
Loglikelihood:  -5386.39   AIC:  10776.78   BIC:  10786.6 
Correlation matrix:
        meanlog sdlog
meanlog       1     0
sdlog         0     1

 

 

正規分布

Fitting of the distribution ' norm ' by maximum likelihood 
Parameters : 
     estimate Std. Error
mean 76.25200   3.004195
sd   95.00104   2.124288
Loglikelihood:  -5972.826   AIC:  11949.65   BIC:  11959.47 
Correlation matrix:
     mean sd
mean    1  0
sd      0  1

R data frameの初めの100行分だけデータを抽出

R data frameの初めの100行分だけデータを抽出

df.LineList 数万行のデータで、これを使って集計したい。スクリプトを作成中はトライ&エラーのところがあって、ちょっとスクリプトを書いては試しを繰り返す。その、試しのスクリプトが機能するかを実行するたびに待ち時間が大きい。そこで、一部だけテスト用に抜き出したい、という場面です。

抜き出したdata frame をdf.testDATA へ代入します

#テスト用にはじめ100行のみのデータ
df.testDATA <- df.LineList[1:100,]

 

 

Rのdata frameに、条件によって異なる値をとるカラムの追加

下図のようなdata frame (df.LineList)があります。【ir_AE】というカラムは、 -1 の場合irAE、0の場合非irAEという情報です。

このir_AEカラムを見ながらirAEかどうかの情報を”IRAE”か”nonIRAE”かという文字列を持つカラム【IFirAE】へ書き込みたいという場合のスクリプト。dplyrパッケージのmutate if_else を使います。

library(dplyr)
df.LineList <- mutate(df.LineList, IFirAE = if_else(ir_AE == -1, true = "IRAE", false = "nonIRAE"))

実行すると次のようになります。(右端のIFirAE列が追加されている)

 

一般化したら次のようになります。(マニュアル

if_else(condition, true, false, missing = NULL, ..., ptype = NULL, size = NULL)

condition

論理ベクトル

true, false

条件の TRUE および FALSE 値に使用するベクトル。 true と false の両方が条件のサイズにリサイクルされます。 true、false、および missing (使用されている場合) は、共通の型にキャストされます。

missing

NULL でない場合は、条件の NA 値の値として使用されます。 true と false と同じサイズと型の規則に従います。

これらのドットは将来の拡張用であり、空にする必要があります。

ptype

必要な出力タイプを宣言するオプションのプロトタイプ。 指定した場合、これは true、false、および missing の共通タイプをオーバーライドします。

size

希望の出力サイズを宣言するオプションのサイズ。 指定した場合、これは条件のサイズをオーバーライドします。

Value

条件と同じサイズ、および true、false、および missing の共通型と同じ型を持つベクトル。
条件が TRUE の場合は true の一致値、FALSE の場合は false の一致値、NA の場合は欠落値の一致値 (指定されている場合)、それ以外の場合は欠落値が使用されます。

感想

SQLならチョイとできるデータの扱いもRだと不慣れで調べながらになるのがもどかしい。もちろんSQLとRを行ったり来たりすればいいのでしょうが、チョイと手間がかかるのと、Rのデータをデータベースへ読み込ませ、それをSQLで加工して、データベースからデータを吐き出して、Rへ読み込ませるというのは、ゴミが入る危険性をはらんでいるのでできれば避けたい作業なのです。

library(sqldf)
df_LineList <- df.LineList
df.new <- sqldf('SELECT *, case
                  when ir_AE == -1 then "IRAE" 
                  when ir_AE == 0 then "nonIRAE" 
                  else "" 
                  end as IFirAE FROM df_LineList')

(でも、Rのsqldfでやろうとすると、case文の文法が私の馴染んでいるやつと結構違う!

Translate »