私は、機能のための最小二乗非線形回帰、一般化のための対数尤度を計算しようとしているによって最適化されたgnls
Rパッケージの機能を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 β次のように計算されます。
ここで、は観測値の数、f ∗ i(β )= f ∗です。
、正定値である Y * iは = Λを- T / 2 iが、Y 、Iおよび F * I(φ I、V I)= Λ - T / 2
固定用 及び λのML推定 σ 2があります
プロファイルされた対数尤度は
これは、Gauss-Seidelアルゴリズムで使用され、次のML推定値を見つけます。 および λの。少ないバイアスされた推定値 σ 2が使用されます。
ここで、はβの長さを表します。
私が直面している特定の質問のリストをまとめました。
- 何ですか?それはin によって生成された距離行列ですか、それとも何らかの形でλによって変換またはパラメーター化する必要がありますか?
big_lambda <- vcv.phylo(tree)
ape
- う BE 、以下の偏った推定(この記事の最後の式)のための方程式を?
fit$sigma^2
- 対数尤度を計算するためにを使用する必要がありますか、それともパラメーター推定の中間ステップですか?また、λはどのように使用されますか?それは、すべての乗算され、それは単一の値またはベクトルであり、Λ Iまたは単に非対角要素など?
- 何です?それはパッケージに入っていますか?もしそうなら、私は和M ∑ i = 1 |を計算する方法について混乱しています。| y ∗ i − f ∗ i
norm(y-f(fit$coefficients,x),"F")
Matrix
norm()
log(diag(abs(big_lambda)))
big_lambda
logm(abs(big_lambda))
expm
logm()
t(solve(sqrtm(big_lambda)))
- はどうですか
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