一般化非線形最小二乗回帰(nlme)の対数尤度を「手で」計算する


12

私は、機能のための最小二乗非線形回帰、一般化のための対数尤度を計算しようとしているf(x)=β1(1+xβ2)β3によって最適化されたgnlsRパッケージの機能をnlme(ブラウン運動と仮定AA系統樹上の距離によって生成された分散共分散行列使用して、corBrownian(phy=tree)からape)パッケージ。次の再現可能なRコードは、x、yデータと9タクサを持つランダムツリーを使用してgnlsモデルに適合します。

require(ape)
require(nlme)
require(expm)
tree <- rtree(9)
x <- c(0,14.51,32.9,44.41,86.18,136.28,178.21,262.3,521.94)
y <- c(100,93.69,82.09,62.24,32.71,48.4,35.98,15.73,9.71)
data <- data.frame(x,y,row.names=tree$tip.label)
model <- y~beta1/((1+(x/beta2))^beta3)
f=function(beta,x) beta[1]/((1+(x/beta[2]))^beta[3])
start <- c(beta1=103.651004,beta2=119.55067,beta3=1.370105)
correlation <- corBrownian(phy=tree)
fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit) 

logLikから得られた推定パラメータに基づいて、対数尤度を「手で」(Rで、ただし関数を使用せずに)計算したいgnlsので、からの出力と一致しますlogLik(fit)。注:パラメーターを推定しようとはしていません。gnls関数によって推定されたパラメータの対数尤度を計算したいだけです(誰かがパラメータなしgnlsでパラメータを推定する方法の再現可能な例を持っているなら、私はそれを見ることに非常に興味があるでしょう!)。

Rでこれをどのように実行するかはよくわかりません。SとS-Plusの混合効果モデル(PinheiroとBates)で説明されている線形代数表記法は頭の上のもので、私の試みはどれも一致していませんlogLik(fit)。PinheiroとBatesが説明する詳細は次のとおりです。

一般化された非線形最小二乗モデルの対数尤度 ここで、 φ I = A I β次のように計算されます。yi=fi(ϕi,vi)+ϵiϕi=Aiβ

l(β,σ2,δ|y)=12{Nlog(2πσ2)+i=1M[||yifi(β)||2σ2+log|Λi|]}

ここで、は観測値の数、f iβ = f Nです。fi(β)=fi(ϕi,vi)

、正定値である Y * iは = Λを- T / 2 iが、Y 、Iおよび F * Iφ IV I= Λ - T / 2Λiyi=ΛiT/2yifi(ϕi,vi)=ΛiT/2fi(ϕi,vi)

固定用 及び λのML推定 σ 2がありますβλσ2

σ^(β,λ)=i=1M||yifi(β)||2/N

プロファイルされた対数尤度は

l(β,λ|y)=12{N[log(2π/N)+1]+log(i=1M||yifi(β)||2)+i=1Mlog|Λi|}

これは、Gauss-Seidelアルゴリズムで使用され、次のML推定値を見つけます。 および λの。少ないバイアスされた推定値 σ 2が使用されます。βλσ2

σ2=i=1M||Λ^iT/2[yifi(β^)]||2/(Np)

ここで、βの長さを表します。pβ

私が直面している特定の質問のリストをまとめました。

  1. 何ですか?それはin によって生成された距離行列ですか、それとも何らかの形でλによって変換またはパラメーター化する必要がありますか?Λibig_lambda <- vcv.phylo(tree)apeλ
  2. BE 、以下の偏った推定(この記事の最後の式)のための方程式を?σ2fit$sigma^2
  3. 対数尤度を計算するためにを使用する必要がありますか、それともパラメーター推定の中間ステップですか?また、λはどのように使用されますか?それは、すべての乗算され、それは単一の値またはベクトルであり、Λ Iまたは単に非対角要素など?λλΛi
  4. 何です?それはパッケージに入っていますか?もしそうなら、私は和M i = 1 |を計算する方法について混乱しています| y if i||yf(β)||norm(y-f(fit$coefficients,x),"F")Matrixi=1M||yifi(β)||2norm()
  5. log|Λi|log(diag(abs(big_lambda)))big_lambdaΛilogm(abs(big_lambda))expmlogm()
  6. ΛiT/2t(solve(sqrtm(big_lambda)))
  7. はどうですかyifi(β)

y_star <- t(solve(sqrtm(big_lambda))) %*% y

そして

f_star <- t(solve(sqrtm(big_lambda))) %*% f(fit$coefficients,x)

それとも

y_star <- t(solve(sqrtm(big_lambda))) * y

そして

f_star <- t(solve(sqrtm(big_lambda))) * f(fit$coefficients,x)

理論上、これらの質問のすべてが回答された場合、対数尤度はからの出力と一致するように計算できるはずlogLik(fit)です。これらの質問のいずれかの助けは大歓迎です。何か説明が必要な場合は、お知らせください。ありがとう!

更新:対数尤度の計算のさまざまな可能性を実験してきましたが、ここまでで最高の結果が得られました。logLik_calcは、によって返される値から一貫して約1〜3離れていますlogLik(fit)。私は実際の解決策に近いか、これは純粋に偶然によるものです。何かご意見は?

  C <- vcv.phylo(tree) # variance-covariance matrix
  tC <- t(solve(sqrtm(C))) # C^(-T/2)
  log_C <- log(diag(abs(C))) # log|C|
  N <- length(y)
  y_star <- tC%*%y 
  f_star <- tC%*%f(fit$coefficients,x)
  dif <- y_star-f_star  
  sigma_squared <-  sum(abs(y_star-f_star)^2)/N
  # using fit$sigma^2 also produces a slightly different answer than logLik(fit)
  logLik_calc <- -((N*log(2*pi*(sigma_squared)))+
       sum(((abs(dif)^2)/(sigma_squared))+log_C))/2

fバツバツ

回答:


10

残差に相関構造がない単純なケースから始めましょう。

fit <- gnls(model=model,data=data,start=start)
logLik(fit)

その後、対数尤度は、以下を使用して手動で簡単に計算できます。

N <- fit$dims$N
p <- fit$dims$p
sigma <- fit$sigma * sqrt((N-p)/N)
sum(dnorm(y, mean=fitted(fit), sd=sigma, log=TRUE))

残差は独立しているため、次を使用できます。 dnorm(..., log=TRUE)ているため、個々の対数尤度項を取得する(そしてそれらを合計する)ためにます。または、次を使用できます。

sum(dnorm(resid(fit), mean=0, sd=sigma, log=TRUE))

fit$sigmaの「あまり偏っ見積もりではありませんσ2"-そのため、最初に手動で修正する必要があります。

次に、残差が相関するより複雑なケースについて説明します。

fit <- gnls(model=model,data=data,start=start,correlation=correlation)
logLik(fit)

ここでは、多変量正規分布を使用する必要があります。これにはどこかに機能があると確信していますが、これを手動で行ってみましょう。

N <- fit$dims$N
p <- fit$dims$p
yhat <- cbind(fitted(fit))
R <- vcv(tree, cor=TRUE)
sigma <- fit$sigma * sqrt((N-p)/N)
S <- diag(sigma, nrow=nrow(R)) %*% R %*% diag(sigma, nrow=nrow(R))
-1/2 * log(det(S)) - 1/2 * t(y - yhat) %*% solve(S) %*% (y - yhat) - N/2 * log(2*pi)

無相関残差の対数尤度は完全に機能しましたが、多変量正規分布を把握することはできません。この場合、Sとは何ですか?S <-vcv.phylo(tree)を試し、対数尤度で約-700を得ましたが、logLik(fit)は約-33でした。
エリック

申し訳ありませんが、コードをコピーして貼り付けたときに台無しになりました。これで完成です。Sは、残差の分散共分散行列です。あなたは(vcv関数で)正しい軌道に乗っていましたが、相関行列を取得してから使用する必要がありますσ^2これをvar-cov行列に変換します。
ヴォルフガング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.