MLE /対数正規分布区間の可能性


8

以下のサンプルのように、間隔として表される応答の変数セットがあります。

> head(left)
[1]  860  516  430 1118  860  602
> head(right)
[1]  946  602  516 1204  946  688

ここで、左は応答の下限、右は応答の上限です。対数正規分布に従ってパラメーターを推定したい。

しばらくの間、可能性を直接計算しようとしたとき、2つの境界が異なるパラメーターのセットに沿って分布しているため、以下のようないくつかの負の値が得られるという事実に苦労していました。

> Pr_high=plnorm(wta_high,meanlog_high,sdlog_high)
> Pr_low=plnorm(wta_low, meanlog_low,sdlog_low)
> Pr=Pr_high-Pr_low
> 
> head(Pr)
[1] -0.0079951419  0.0001207749  0.0008002343 -0.0009705125 -0.0079951419 -0.0022395514

私は実際にそれを解決する方法を理解できず、代わりに間隔の中間点を使用することに決めました。これは、間隔応答の対数尤度を抽出するmledist関数を見つけるまで、良い妥協です。これは私が得る要約です:

> mledist(int, distr="lnorm")
$estimate
meanlog     sdlog 
6.9092257 0.3120138 

$convergence
[1] 0

$loglik
[1] -152.1236

$hessian
         meanlog       sdlog
meanlog 570.760358    7.183723
sdlog     7.183723 1112.098031

$optim.function
[1] "optim"

$fix.arg
NULL

Warning messages:
1: In plnorm(q = c(946L, 602L, 516L, 1204L, 946L, 688L, 1376L, 1376L,  :
NaNs produced
2: In plnorm(q = c(860L, 516L, 430L, 1118L, 860L, 602L, 1290L, 1290L,  :
NaNs produced

パラメータ値は理にかなっているようで、対数尤度は、私が使用した他のどの方法よりも大きくなっています(中点分布または境界のいずれか1つの分布)。

わからない警告メッセージがあります。私が正しいことをしているのかどうか、またこのメッセージの意味を誰かに教えてもらえますか?

ヘルプに感謝します!


あなたの質問は、「特定のR関数の使用方法とこの警告メッセージの意味を教えてください」に相当します。それはCrossValidatedではなくStackOverflowの質問です。さらに、パッケージから関数を参照するときは、それがどのパッケージからのものであるかについて言及する必要があります。この場合、私はあなたがパッケージの関数を意味していると思いますfitdistrplus
Glen_b-モニカを復活させる2013

@ElioDrumlへようこそ。あなたの主な質問がこれらのパラメーターをどのように見積もるか、または警告メッセージの意味が何であるかについて言えません。前者はCVにとって適切な質問ですが、後者は実際にはスタックオーバーフローに関する質問です(FAQを参照)。主な質問は何ですか?Qをここに留めるか、SOに移行しますか?(後者は、フラグあなたのQ&私たちはあなたのためにそれを移行します場合は、けれども、ないクロスポストをしてください。)
GUNG -復活モニカ

回答:


9

可能性を正しく計算していないようです。

x

  1. Fθ

  2. ab>abax

PrFθ(axb)=Fθ(b)Fθ(a).

一例として、ここでRの値は実装ベクトルであり、値ベクターで、および対数正規であるが。(これは汎用のソリューションではありません。特に、すべてのデータについておよびと想定しています。)aleftbrightFθb>aba

#
# Lognormal log-likelihood for interval data.
#
lambda <- function(mu, sigma, left, right) {
  sum(log(pnorm(log(right), mu, sigma) - pnorm(log(left), mu, sigma)))
}

最大対数尤度を見つけるには、対数平均および対数標準偏差妥当な開始値のセットが必要です。この推定は、各区間をその端点の幾何平均で置き換えます。μσ

#
# Create an initial estimate of lognormal parameters for interval data.
#
lambda.init <- function(left, right) {
  mid <- log(left * right)/2
  c(mean(mid), sd(mid))
}

いくつかのランダムな対数正規分布データを生成し、それらを間隔にビン化してみましょう:

set.seed(17)
n <- 12                     # Number of data
z <- exp(rnorm(n, 6, .5))   # Mean = 6, SD = 0.5
left <- 100 * floor(z/100)  # Bin into multiples of 100
right <- left + 100

フィッティングは、汎用の多変量オプティマイザーで実行できます。(これはデフォルトでは最小化ツールであるため、対数尤度の否定に適用する必要があります。)

fit <- optim(lambda.init(left,right), 
             fn=function(theta) -lambda(theta[1], theta[2], left, right))
fit$par

6.1188785 0.3957045

推定ある遠くないの意図した値から、、との推定ある遠くないの意図した値から、:だけのために悪くない値。近似の程度を確認するために、経験累積分布関数と近似分布関数をプロットしてみましょう。ECDFを構築するために、各間隔を直線的に補間します。μ6.126σ0.400.512

#
# ECDF of the data.
#
F <- function(x) (1 + mean((abs(x - left) - abs(x - right)) / (right - left)))/2

y <- sapply(x <- seq(min(left) * 0.8, max(right) / 0.8, 1), F)
plot(x, y, type="l", lwd=2, lty=2, ylab="Cumulative probability")
curve(pnorm(log(x), fit$par[1], fit$par[2]), from=min(x), to=max(x), col="Red", lwd=2, 
  add=TRUE)

プロット

垂直方向の偏差は一貫して小さく、上下に変化するため、適切に適合しているように見えます。


@whuberへのご意見、ありがとうございます。私はあなたの例を再現しました、そしてそれはすべて理にかなっています。しかし、私は自分のn = 56のデータで頭を左<-c(860、516、430、1118、860、602)および右<-c(946、602、516)に再作成することができませんでした。 、1204、946、688)。次の警告メッセージが表示されます:「1:pnorm(log(right)、mu、sigma):NaNsが生成されました2:In pnorm(log(left)、mu、sigma):NaNsが生成されました」とオプティマイザを使用してmleの見積もり。これで、計算時に負の確率になるという以前の問題に戻ります。段階的に尤度を段階的に減算します。
Elio Druml 2013

これらは、fitdistrplusパッケージのmledist関数によって与えられる同じ警告メッセージです。ただし、上記を見るとわかるように、比較的見栄えの良いmle見積もりの​​出力が得られます。私はそれを信頼すべきですか、そして/またはここでの問題は何ですか?フィードバックをお寄せいただきありがとうございます。
Elio Druml 2013

Elio、データを投稿して、問題を診断できるようにしませんか?それでも、これらが重大なエラーであるかどうかはわかりません。Mathematicaで関数を数値的に最小化すると、別のユーザーから報告された同じ問題が発生するかもしれません。同じ説明があなたの場合にも当てはまるかもしれません。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.