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で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
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 |
| useHoskingZt4 | Hoskingのτ_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.
<おすすめのRに関する書籍です>
累積分布関数を計算し、プロット:z.par2cdfコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| x | 実数値ベクトル。 | |
| p | (ヘルプ参照) | |
| para | lmom2parや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)を指定。 | |
| p | z値の非超過確率。 | |
| para | lmom2parや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.control | NPP軸に影響を与えるリスト。 | NULL |
| RI.control | 軸の影響を指定するためのリスト。 | NULL |
| SNV.control | 軸の影響を指定するためのリスト。 | NULL |
| npp.digits | 丸め桁数を指定する。 | 3 |
| npp.line | mtext 行を指定する。 | 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))
<おすすめのRに関する書籍です>
plotlmrdiaコマンドの使用例
| オプション | 意味 | 初期値 |
|---|---|---|
| lmr | L-モーメント図オブジェクト。 | NULL |
| nopoints | 点分布は描かれない。 | FALSE |
| nolines | 線分布は描かれない。 | FALSE |
| nolimits | L-momentsの理論限界は描かれない。 | FALSE |
| noaep4 | 下限値の線は描かれない。 | FALSE |
| nogev | 極値分布の線は描かれない。 | FALSE |
| noglo | 対数正規分布の線は描かれない。 | FALSE |
| nogno | 一般化された正常分布の線は描かれない。 | FALSE |
| nogov | Govindarajulu分布の線は描かれない。 | FALSE |
| nogpa | パレート分布の線は描かれない。 | FALSE |
| nope3 | Pearson 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コマンドの使用例
| オプション | 意味 | 初期値 |
|---|---|---|
| lmr | L-moment図のオブジェクトを指定。(ヘルプ参照) | NULL |
| nopoints | 点分布は描かれない。 | FALSE |
| nolines | 線分布は描かれない。 | FALSE |
| noaep4 | 対称指数分布を描かない。 | FALSE |
| nogld_byt5opt | τ_5 = 0での解析的解を用いない。 | TRUE |
| nopdq4 | 多項式密度量体4分布を描かない。 | FALSE |
| nost3 | Studentのt分布を描かない。 | FALSE |
| nosymgdd | 対称ガンマ差分分布を描かない。 | TRUE |
| nosymstable | 安定分布を描かない。 | FALSE |
| notukey | Tukey 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"
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。