本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:信頼性・生存時間分析のためのL-moment統計「lmomco」パッケージ

保健医療や生物統計学分野では、生存時間データや信頼性分析に取り組む機会が多くあります。このような領域では、分布の特性やパラメータを推定することが重要な課題です。例えば、製品の故障率や患者の生存率を分析する際には、正確な分布モデリングとパラメータ推定が必要となります。

このような時におすすめなのが「lmomco」パッケージです。このパッケージでは、L-Momentsや分布のパラメータ推定、LM比率図作成、多変量Lコモメント解析などが可能です。特に、右側・左側打ち切り(censoring)に対応したL-momentの計算や、13種類の分位関数演算子(quantile function operators)により、信頼性・生存時間分析に対応しています。

他のL-moment関連パッケージ(lmomやLmomentsなど)と比較した強みは、対応する分布の種類の豊富さと、打ち切りやトリムL-momentといった拡張的な解析手法までを一貫したインターフェースでカバーする総合性です。目的に応じた分布フィッティングや信頼性分析を効率よく実行できるため、研究や業務の効率化に貢献します。

パッケージバージョンは2.5.7。Windows 11 x64 (build 26200)のR version 4.6.0で確認しています。

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
install.packages("lmomco")
# パッケージの読み込み
library("lmomco")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。

信頼性係数(L-alpha)の計算:headrick.sheng.lalphaコマンド

Headrick and Sheng (2013) の論文中のTable 1データを用いて、観測値どうしの相関構造からL-alpha(信頼性係数)を算出する例します。引数の指定方法(Lコモメント行列を直接与える、共分散パスウェイを使う、非超過確率を利用しないなど)によって、得られるalpha値がどう変わるかを確認できます。

オプション意味初期値
xランダム観測値のデータフレーム。
bycovFF共分散パスウェイを有効にするかどうかを指定する論理値。FALSE
aプロット位置を指定する。0.5
digits返り値の丸め桁数。8
### データ作成#####
# Headrick and Sheng (2013) の Table 1
# 1〜3列目が観測値、4〜6列目が推定非超過確率
TV1 <-
  c(2, 4, 3, 0.15, 0.45, 0.15,       5, 7, 7, 0.75, 0.95, 1.00,
    3, 5, 5, 0.35, 0.65, 0.40,       6, 6, 6, 0.90, 0.80, 0.75,
    7, 7, 6, 1.00, 0.95, 0.75,       5, 2, 6, 0.75, 0.10, 0.75,
    2, 3, 3, 0.15, 0.25, 0.15,       4, 3, 6, 0.55, 0.25, 0.75,
    3, 5, 5, 0.35, 0.65, 0.40,       4, 4, 5, 0.55, 0.45, 0.40)
T1 <- matrix(ncol=6, nrow=10)
for(r in seq(1,length(TV1), by=6)) T1[(r/6)+1, ] <- TV1[r:(r+5)]
colnames(T1) <- c("X1", "X2", "X3", "FX1", "FX2", "FX3"); T1 <- as.data.frame(T1)

lco2 <- matrix(nrow=3, ncol=3)
lco2[1,1] <- lmoms(T1$X1)$lambdas[2]
lco2[2,2] <- lmoms(T1$X2)$lambdas[2]
lco2[3,3] <- lmoms(T1$X3)$lambdas[2]
lco2[1,2] <- 2*cov(T1$X1, T1$FX2); lco2[1,3] <- 2*cov(T1$X1, T1$FX3)
lco2[2,1] <- 2*cov(T1$X2, T1$FX1); lco2[2,3] <- 2*cov(T1$X2, T1$FX3)
lco2[3,1] <- 2*cov(T1$X3, T1$FX1); lco2[3,2] <- 2*cov(T1$X3, T1$FX2)
########

# Headrick and Sheng (2013) の結果:alpha = 0.807
headrick.sheng.lalpha(lco2)$alpha
L-alpha 
0.8074766 

headrick.sheng.lalpha(Lcomoment.matrix(T1[,1:3], k=2)$matrix)$alpha
L-alpha 
0.7805825 

# FXsを使用しない場合:alpha = 0.781
headrick.sheng.lalpha(T1[,1:3])$alpha
L-alpha 
0.7805825

# a=0.5(デフォルトはHazen法)
headrick.sheng.lalpha(T1[,1:3], bycovFF=TRUE)$alpha
L-alpha 
0.7805825

headrick.sheng.lalpha(T1[,1:3], bycovFF=TRUE, a=0.5)$alpha
L-alpha 
0.7805825

正規分布に基づく正常性検定:tau34sq.normtestコマンド

オプション意味初期値
x値のベクトル。
alphaα水準。0.05
pvalue.onlyテストのp値のみを返す。FALSE
getlist計算結果の要約リスト。TRUE
useHoskingZt4Hoskingのτ_4の近似式を使うかどうかを指定する。TRUE
verboseテストの要約を出力。FALSE
digits要約の桁数を指定。4
# 正規分布の母平均と分散の検定を行う
HarriCoble <- tau34sq.normtest(rnorm(20), verbose=TRUE)
#        *** Harri-Coble Tau34-squared Test for Normality ***
#  --A normality test using sample L-skew (T3) and L-kurtosis (T4)--
#  Z-score(T3) = -0.4828 and Z-score(T4) = -0.114
#    (Mapping of T3 and T4 to standard normal variates)
#  Tau34-squared test statistic, T34sq = Z(T3)^2 + Z(T4)^2
#    (A squared Euclidean distance that is Chi-Squared(df=2) distributed.)
#  T34sq = 0.2461 |--> ChiSquared(T34sq, df=2) = pchisq(T34sq, df=2)
#  ChiSquared(0.2461, 2 degrees freedom) = 11.58 percentile
#    p-value = 0.8842 [complement of the pchisq(T34sq, df=2, lower.tail=TRUE)]
#    The p-value is > alpha: accept Ho, conclude 'normal data'.
#  Reference:
#   Harri, A. and Coble, K.H., 2011, Normality testing---
#     Two new tests using L-moments: J. Appl. Stat. 38(7), 1369-1379.

累積分布関数を計算し、プロット:z.par2cdfコマンド

オプション意味初期値
x実数値ベクトル。
p(ヘルプ参照)
paralmom2parやvec2parから得たパラメーター。
z閾値を指定。0
# 乱数を固定
set.seed(21)
the.gpa   <- vec2par(c(100,1000,0.1),type='gpa')

# データをシミュレーション
fake.data <- rlmomco(30,the.gpa)

# ゼロの観測値を追加
fake.data <- sort(c(fake.data,rep(0,10)))

# 目盛りを内側に向け、右軸にもタイトルを付けるためプロットパラメータを変更
par(mgp=c(3,0.5,0), mar=c(5,4,4,3))

# 正の値のデータについてパラメータを計算
gpa.all <- pargpa(lmoms(fake.data))
gpa.nzo <- pargpa(lmoms(fake.data[fake.data > 0]))

# サンプルサイズ
n <- length(fake.data)

# ゼロ値の推定確率
p <- length(fake.data[fake.data == 0])/n
F <- nonexceeds(sig6=TRUE); F <- sort(c(F,p)); qF <- qnorm(F)

# 以下のxベクトルには元々ゼロが含まれるため、挿入は不要
# x<0では不合理だが、実装のテストのため使用
x <- seq(-100, max(fake.data))

# シミュレーションデータのプロット位置を計算
PP <- pp(fake.data)

# サンプルをプロット
plot(fake.data, qnorm(PP), xlim=c(0,4000), yaxt="n", ylab="")
add.lmomco.axis(las=2, tcl=0.5, side=2, twoside=FALSE,
                                        side.type="NPP", otherside.type="SNV")

# 母集団分布(ゼロを除く)
lines(quagpa(F,gpa.all), qF)
cdf <- qnorm(z.par2cdf(x,p,gpa.nzo))

# 上記のヘルプを参照
cdf[! is.finite(cdf)] <- min(fake.data,qnorm(PP))

# ゼロを条件としたフィッティングモデル
lines(x, cdf,lwd=3)

# 上記のコードを繰り返し実行し、結果の変化を確認
# デフォルト設定に戻す
par(mgp=c(3,1,0), mar=c(5,4,4,2)+0.1)

四分位函数を計算しプロット:z.par2quaコマンド

オプション意味初期値
f確率の範囲(0〜1)を指定。
pz値の非超過確率。
paralmom2parやvec2parから得たパラメーター。
z閾値を指定。0
# 母集団パラメータ(真の値に近いもの)を定義
the.gpa   <- vec2par(c(100,1000,0.1),type='gpa')

# データをシミュレーション
fake.data <- rlmomco(30,the.gpa)

# ゼロの観測値を追加
fake.data <- sort(c(fake.data, rep(0,10)))

# 目盛りを内側に向けるためパラメータを変更
par(mgp=c(3,0.5,0))

# 正の値のデータについてパラメータを計算
gpa.all <- pargpa(lmoms(fake.data))
gpa.nzo <- pargpa(lmoms(fake.data[fake.data > 0]))

# サンプルサイズ
n <- length(fake.data)

# ゼロ値の推定確率
p <- length(fake.data[fake.data == 0])/n
F <- nonexceeds(sig6=TRUE); F <- sort(c(F,p)); qF <- qnorm(F)

# シミュレーションデータのプロット位置を計算
PP <- pp(fake.data)

# サンプルをプロット
plot(qnorm(PP), fake.data, ylim=c(0,4000), xaxt="n", xlab="")
add.lmomco.axis(las=2, tcl=0.5, twoside=TRUE, side.type="SNV", otherside.type="NA")

# 母集団分布(ゼロを除く)
lines(qF,quagpa(F,gpa.all))

# ゼロを条件としたフィッティングモデル
lines(qF,z.par2qua(F,p,gpa.nzo),lwd=3)

# デフォルト設定に戻す
par(mgp=c(3,1,0))

lmomco軸を追加してプロット:add.lmomco.axisコマンド

オプション意味初期値
sideプロットの側面を指定する。1
twoside反対側にチックマークを反映するかどうかを指定する。(ヘルプ参照)FALSE
twoside.suppress.labels反対側でのラベリングを無効にする。FALSE
side.type主要な側の軸タイプを指定する。c(“NPP”, “RI”, “SNV”)
otherside.type反対側の軸タイプを指定する。デフォルトは不適用。c(“NA”, “RI”, “SNV”, “NPP”)
alt.lab軸ラベルを変更するショートカット。NA
alt.other.lab代替ラベルを指定する。NA
npp.as.aep非超過確率を超過確率に変換する。FALSE
caseデフォルトのラベルケースを指定する。c(“upper”, “lower”)
NPP.controlNPP軸に影響を与えるリスト。NULL
RI.control軸の影響を指定するためのリスト。NULL
SNV.control軸の影響を指定するためのリスト。NULL
npp.digits丸め桁数を指定する。3
npp.linemtext 行を指定する。3
# 目盛りを内側に向けるためパラメータを変更
par(mgp=c(3,0.5,0))

# 合成データを生成
X <- sort(rnorm(65)); pp <- pp(X)

# lmomco軸を追加してプロット
plot(qnorm(pp), X, xaxt="n", xlab="", ylab="QUANTILE", xlim=c(-2,3))
add.lmomco.axis(las=2, tcl=0.5, side.type="RI", otherside.type="NPP")

# デフォルト設定に戻す
par(mgp=c(3,1,0))

plotlmrdiaコマンドの使用例

オプション意味初期値
lmrL-モーメント図オブジェクト。NULL
nopoints点分布は描かれない。FALSE
nolines線分布は描かれない。FALSE
nolimitsL-momentsの理論限界は描かれない。FALSE
noaep4下限値の線は描かれない。FALSE
nogev極値分布の線は描かれない。FALSE
noglo対数正規分布の線は描かれない。FALSE
nogno一般化された正常分布の線は描かれない。FALSE
nogovGovindarajulu分布の線は描かれない。FALSE
nogpaパレート分布の線は描かれない。FALSE
nope3Pearson Type III分布の線は描かれない。FALSE
nopdq3不描画を指定FALSE
noweiウェイブル分布の非描画を指定 (ヘルプ参照)TRUE
nocauカウチー分布の非描画を指定TRUE
noexp指数分布の非描画を指定FALSE
nonor標準正規分布の非描画を指定FALSE
nogumガンブル分布の非描画を指定FALSE
norayレイリー分布の非描画を指定FALSE
nouniユニフォーム分布の非描画を指定FALSE
noslaスラッシュ分布の非描画を指定TRUE
xlab水平軸ラベル“L-skew (Tau3), dimensionless”
ylab軸ラベルを指定。“L-kurtosis (Tau4), dimensionless”
add新しいプロットを開始するかどうかを指定。FALSE
empty条件が満たされる前に返すかどうかを指定。FALSE
autoaxesデフォルトの軸を表示するかどうかを指定。TRUE
autolegendレジェンドを生成。FALSE
xlegレジェンドのX座標を指定。NULL
ylegレジェンドのY座標を指定。NULL
legendcexレジェンドのサイズを指定。0.9
ncolレジェンドの列数を指定。1
text.widthレジェンドの設定を指定。NULL
lwd.cex線幅の拡大率を指定。1
expand.names凡例中の分布名を展開するかどうか。FALSE
# lmrdia()のプロットを行う
plotlmrdia(lmrdia())

plotlmrdia46コマンドの使用例

オプション意味初期値
lmrL-moment図のオブジェクトを指定。(ヘルプ参照)NULL
nopoints点分布は描かれない。FALSE
nolines線分布は描かれない。FALSE
noaep4対称指数分布を描かない。FALSE
nogld_byt5optτ_5 = 0での解析的解を用いない。TRUE
nopdq4多項式密度量体4分布を描かない。FALSE
nost3Studentのt分布を描かない。FALSE
nosymgdd対称ガンマ差分分布を描かない。TRUE
nosymstable安定分布を描かない。FALSE
notukeyTukey Lambda分布を描かない。FALSE
nocau分布の点を描かない。TRUE
nolap分布の点を描かない。FALSE
nonor標準正規分布の非描画を指定FALSE
nosla分布の点を描かない。TRUE
trucate.tau4.to.gtzero負のτ_4まで伸びる分布を0に制限する。TRUE
xlab水平軸ラベル“L-kurtosis (Tau4), dimensionless”
ylab軸ラベルを指定。“Sixth L-moment ratio (Tau6), dimensionless”
add新しいプロットを開始するかどうかを指定。FALSE
empty条件が満たされる前に返すかどうかを指定。FALSE
autoaxesデフォルトの軸を表示するかどうかを指定。TRUE
autolegendレジェンドを生成。FALSE
xlegレジェンドのX座標を指定。NULL
ylegレジェンドのY座標を指定。NULL
legendcexレジェンドのサイズを指定。0.9
ncolレジェンドの列数を指定。1
text.widthレジェンドの設定を指定。NULL
lwd.cex線幅の拡大率を指定。1
expand.names凡例中の分布名を展開するかどうか。FALSE
# プロット
plotlmrdia46(lmrdia46(), 
              nogld_byt5opt=FALSE, 
              nosymgdd=FALSE, 
              autolegend=TRUE, 
              xleg="topleft")

実行例

データの生成とL-momentの計算

# 乱数シード設定
set.seed(123)

# 正規分布からデータを生成
data <- rnorm(100, mean = 50, sd = 10)

# L-momentを計算
lmoments_data <- lmoms(data)

# L-momentの結果表示
lmoments_data

実行結果:

$lambdas
[1] 50.9040591  5.1781669  0.1381172  0.6560920 -0.0870208

$ratios
[1]          NA  0.10172405  0.02667299  0.12670353 -0.01680533

$trim
[1] 0

$leftrim
NULL

$rightrim
NULL

$source
[1] "lmoms"


この記事が誰かの役に立ちますように。

スポンサーリンク