2変量正常症例のMLEアルゴリズムを構築しようとしている場合があります。しかし、私はどこかでエラーがないように見えますが、スクリプトを実行すると警告が表示されます。私はいくつかの最適化機能を試してみた平均vector = (0,0)
と共分散matrix = matrix(c(2.2,1.8,1.8,3),2,2)
多変量症例(多変量正常)のMLEの実施R
と変量正規分布から
私はサイズのサンプルn個持っている(100で訓練を受けた固定定数を、それ以外何もすることができます)(を含みますnlm()
,mle()
,spg()
およびoptim()
)を使用して、尤度関数を最大化する(または否定尤度を最小にする)が、警告またはエラーが存在する。
require(MASS)
require(tmvtnorm)
require(BB)
require(matrixcalc)
私は、次のように最初の尤度関数を定義しました。
bvrt_ll = function(mu,sigma,rho,sample)
{
n = nrow(sample)
mu_hat = c(mu[1],mu[2])
p = length(mu)
if(sigma[1]>0 && sigma[2]>0)
{
if(rho<=1 && rho>=-1)
{
sigma_hat = matrix(c(sigma[1]^2
,sigma[1]*sigma[2]*rho
,sigma[1]*sigma[2]*rho
,sigma[2]^2),2,2)
stopifnot(is.positive.definite(sigma_hat))
neg_likelihood = (n*p/2)*log(2*pi) + (n/2)*log(det(sigma_hat)) + 0.5*sum(((sample-mu_hat)%*%solve(sigma_hat)%*%t(sample-mu_hat)))
return(neg_likelihood)
}
}
else NA
}
私はシグマおよびRhoの制約を設定することができますので、私はこの1つを好まが、私はMLEを(使用する場合)
> mle(minuslogl = bvrt_ll ,start = list(mu = mu_est,sigma=sigma_est,rho =
rho_est)
+ ,method = "BFGS")
Error in optim(start, f, method = method, hessian = TRUE, ...) :
(list) object cannot be coerced to type 'double'
私はまた、パッケージBB
でnlm
とspg
を試してみましたが、彼らはしませんでした助けてください。私は制約を定義せずに(最適化関数ではなく、可能性の中で)同じ関数を試しましたが、nlm
とspg
のようにいくつかの結果が出るかもしれませんが、共分散行列が正定値ではないためそれは反復によるものだと思います。共分散行列を反復することが正の定理ではないかもしれないし、制約を定義していないという事実によると思います。
したがって、私は二変量正規のアルゴリズムを構築する必要があります。ここで私は間違いを犯しますか?
注:最適化機能を次のように試してみました(私は正しいとは確信していません)。
neg_likelihood = function(mu,sigma,rho)
{
if(rho>=-1 && rho<=1)
{
-sum(mvtnorm::dmvnorm(x=sample_10,mean=mu
,sigma = matrix(c(sigma[1]^2
,sigma[1]*sigma[2]*rho,sigma[1]*sigma[2]*rho
,sigma[2]^2),2,2),log = T))
}
else NA
}
助けていただければ幸いです。
ありがとうございました。 0123は、母集団平均を指定する長さ2のベクトルであり、σは、長さ2のベクトル(ランダム変数の母集団標準偏差を指定する)であり、rhoは、二変量r.v s間の相関係数としてのスカラーである。
ご意見ありがとうございます。しかし、あなたが提案したものが実際に共分散のためのMLEであることを反復プロセスで示したいと思います。共分散行列とμベクトルが尤度関数を最大にすることを示すために、数生成と最適化プロセスを行う必要があります。 – Devrim
ニュートンのメソッド(たとえ)を実装しても、分析グラデーションとヘッセ行列を指定すると、1回の繰り返しで収束します。別の例が必要です。 **あなたがこれをやりたいのであれば、とにかくあなたのパラメータを再paramatizeして、共分散行列のコレスキー分解。 –
確かに、私は制約を適切に設定できなかったので、Rコードは警告またはエラーで実行されます。 "if(rho> = - 1 &&ρ<= 1)"という関数で制約を設定しようとしたとき、それは機能しませんでした。私は制約を適切に設定すれば、それは私が思うように、私が推測する制約のみで助けが必要です。使用法と例には説明がありません。同様に、私は複数のパラメータを持っているので、constrOptim、spg、nlm、またはmle関数をこの場合に適切な制約を使ってどのように使うかのように。 – Devrim