==== 確率分布のパラメータの最尤推定 ==== MASSパッケージに収められている関数fitdistrは、「互いに独立に同一の確率分布に従う確率変数の実現値」であるデータから確率分布のパラメータの最尤推定値を算出してくれる。 |関数|fitdistr| |目的|確率分布のパラメータの最尤推定値を算出する| |書式|fitdistr(データ, 確率分布, 初期値もしくは初期値リスト)| |返り値(表示)|パラメータ名と最尤推定値と(漸近)標準誤差| |返り値(詳細)|estimate:最尤推定値のリスト, sd:標準誤差のリスト, vcov:漸近共分散行列, n:サンプルサイズ, loglik:対数尤度の最大値| データはc()で囲んだ数値列(リストという)で与える。 x = c(1,3,4,2,3,4,3,2,1) 確率分布は次の一覧から選んで指定する。 |確率分布|与え方|パラメータ数|初期値を与えるべきか否か| |ベータ分布|densfun="beta"|2|start=c(shape1=2,shape2=1)初期値必須| |コーシー分布(自由度1のt分布)|densfun="cauchy"|2|start=list(location=,scale=)| |カイ2乗分布|densfun="chi-squared"|2|不明| |指数分布|densfun="exponential"|1|初期値不要| |ガンマ分布|densfun="gamma"|2|start=list(shape=,rate=)| |幾何分布|densfun="geometric"|1|初期値不要| |対数正規分布|densfun="log-normal"|2|初期値不要| |対数正規分布|densfun="lognormal"|2|初期値不要| |ロジスティック分布|densfun="logistic"|2|start=list(location=,scale=)| |負の二項分布|densfun="negative binomial"|2|start=list(size=,mu=)| |正規分布|densfun="normal"|2|初期値不要| |ポアソン分布|densfun="Poisson"|1|初期値不要| |t分布|densfun="t"|2|不明| |ワイブル分布|densfun="weibull"|2|start=list(shape=,scale=)| 初期値はパラメータの数分の長さの数字列を名前付きリストで与える。 正規分布に従うデータから、正規分布のパラメータを推定するには、次のようにする。 fitdistr(c(1,2,1,3,4,1,2,3,1),densfun="normal") ワイブル分布のパラメータを推定するには、次の1行を実行する。 fitdistr(c(1,2,1,3,4,1,2,3,1),densfun="weibull") データを別のオブジェクトに保存してから、関数fitdistrに渡しても良い。 x = c(1,2,1,3,4,1,2,3,1) fitdistr(x,densfun="weibull") 初期値を指定する場合には、確率分布ごとのパラメータ名つきのリストで与える。 fitdistr(c(1,2,1,3,4,1,2,3,1),densfun="weibull",start=list(shape=1,scale=1)) library(MASS) [[r:survival:data.frame]]のようにデータを与えてあるとする。関数fitdistrを用いて、ワイブル分布を仮定し、その2つの母数を推定してみる。 fitdistr(X$time, densfun="weibull") その結果、次の数値を得る。 shape scale 1.6822280 6.8219220 (0.4279334) (1.3515357) ワイブル分布には形状母数shapeと尺度母数scaleがある。それぞれの点推定値は1.6822280と6.8219220であり、標準誤差は括弧の中に表示される。 これらは、次のようにしても表示される。 X.fit.weibull <- fitdistr(X$time, densfun="weibull") names(X.fit.weibull) X.fit.weibull$estimate X.fit.weibull$sd X.fit.weibull$loglik 最後の数値は、最尤推定法で最大化した対数尤度関数の最大値である。この値を参考に、寿命分布を選ぶこともある。 対数正規分布も推定しておく。 X.fit.lognormal <- fitdistr(X$time, densfun="lognormal") names(X.fit.lognormal) X.fit.lognormal$estimate X.fit.lognormal$sd X.fit.lognormal$loglik 同様に、ガンマ分布。 X.fit.gamma <- fitdistr(X$time, densfun="gamma") names(X.fit.gamma) X.fit.gamma$estimate X.fit.gamma$sd X.fit.gamma$loglik