特定のモデルが2つの記述を持つことができるという些細な意味を除いて、識別可能性の問題はありません。本当の問題は、モデルのフィッティングの難しさのように見えますが、それは、識別可能性の欠如ではなく、モデルのパラメーター化の方法が原因です。
この問題にも平凡な解決策があります。一般性を失うことなく、その宣言します。本当にうるさくなりたい場合は、場合、主張します。β≥δβ=δα≥γ
残念ながら、これには、これらの制約を尊重するためにモデルを適合させるための手順が必要です。ただし、ここでの制約の導入はそれほど悪いことではありません。アプリケーションが明らかにすべてのパラメーターがとにかく負ではないためです。パラメーター空間には既に鋭い境界があります。もう1つの制約を含めても、モデルの適合方法を変更する必要はありません。
制約付き最適化を非制約付き最適化に変換する1つのよく知られた方法は、新しいパラメーター空間で境界が無限に押し出されるように問題を再パラメーター化することです。ここでそれを達成する多くの方法があります。パラメータが何を意味するかを考慮することで、ガイドが得られます。特に、は、関数によって達成される最大値 for。与えられた場合、必然的におよびν=α+γ
t→g(t;α,β,γ,δ)=α(1−e−βt)+γ(1−e−δt)
t≥0ν0≤α≤νγ=ν−α。負でない値の合計が固定された全体である場合、角度の観点から全体の比率をパラメーター化するために機能することがよくあります。さらに、、、およびが正であることを確認する簡単な方法は、それらを指数関数にすることです。つまり、それらの対数をパラメーターとして使用します。最後に、、をある角度x二乗余弦になるように設定します。したがって、関数を当てはめることで問題を再パラメーター化する可能性があります
νβδδ≤βδβ
t→f(t;n,a,b,d)=en(1−cos(a)2exp(−ebt)−sin(a)2exp(−ebcos(d)2t)).
これらのパラメーターの推定値(ちなみに、角度とあいまいさのために「識別可能」ではありません)から、元のパラメーターを次のように復元できます。ad
αβγδ=encos(a)2=eb=ensin(a)2=ebcos(d)2.
指数関数とトリガー関数のプロパティは、すべての制約が保持されることを保証します:、、および。(倍精度浮動小数点数は天文学的に小さくなる可能性があるため、これらの制約ではと間に実際的な違いはありません。)α>0β≥δ>0γ>0>≥
この明確に定義された意味では、モデルを適合させるために使用されるパラメーターが識別可能でなくても、モデルは識別可能です。
MCMCを使用することもできますが、目的が曲線の当てはめだけの場合は、Newton-Raphsonなどの数値ソルバーを使用する方が簡単です。 秘訣は良い初期値を見つけることです。 の最大値はわずかな過大評価になります。だから、おそらく始め。各コンポーネントが全体に大きな貢献をすると仮定してで始めることができます。予想される減衰率に基づいて、とについて妥当な推測を行います。たとえば、の範囲が妥当である場合、を最大の一部とするyienn=log(max(yi)/2)a=π/4ebedtbtおよびおそらく任意にます。小さい開始値を使用する可能性があります。(多くの場合、これらの選択に応じてパラメーター推定の異なる値を取得しますが、通常、それらは関数自体にそれほど影響を与えません。)d=π/4f
多くの状況で、このアプローチは非常にうまく機能します。 エラーの分散がと同じかそれ以上の場合(大量のデータがないと信号をまったく識別しにくい場合)を除き、近似は少量のデータでも機能します:すべて必要なのは4つです。maxyi
モデルがどのように適合しているかに関係なく、通常はパラメーターに大きな不確実性があることに注意してください。この曲線のファミリーは、本質的に2パラメーターの指数ファミリー小さな摂動です。多くの状況では、2つのパラメーター(振幅と最長の減衰率)は妥当な精度で識別できますが、他の2つのパラメーターは、この指数形状からの小さな変動を反映しているため、通常は非常に不確かです。t→Ae−BtAB
図は、挑戦的な適合の例を示しています。 下にある曲線は黒で示されています。最終的には、非常にゆっくりと最大に達します。灰色の点としてプロットされているデータポイントのみが使用可能です。ランダムエラーの標準偏差はで、その最大値のかなりの割合です。エラーの多くは正の値で、フィットした赤の曲線が少し高くなります。近似曲線の2つの指数成分は、灰色の破線と点線で示されています。時間までにしきい値に急速に上昇することが示されています。もう1つは、他の指数関数的なしきい値への上昇を反映しています。4/3241/21/3t=11。(データポイント以上になるまで、付近でその鋭い "ショルダー"を再現する希望はほとんどありません。以下のコードを変更して試してください。)t=11000n
特定の問題での成功は、エラーの大きさに依存します。サンプリングされるの値の範囲。これらの値の間隔。使用可能な値の数。開始値の選択。それにも関わらず、これは一般に扱いにくい問題であるように見えます。さらに、どのような最尤フィッターも同様に処理して、残差の二乗の合計を最小化し、さらに、パラメーターの信頼領域を提供します。t
これは、R
この提案をテストするために使用したコードです。これは図を再現し、簡単に変更できます(最初に変数の値を変更します)。
#
# Describe the underlying model
#
set.seed(17)
alpha <- 1
beta <- 2
gamma <- 1/3
delta <- 1/10
sigma <- 1/2 # Error SD.
n <- 24
x.max <- 20 # Largest value of t.
#
# The original parameterization.
#
g <- function(x, alpha, beta, gamma, delta) {
alpha * (1 - exp(-beta * x)) + gamma * (1 - exp(-delta * x))
}
#
# The re-parameterization. `f.1` and `f.2` are the two exponential components.
#
f <- function(x, nu, t.a, log.b, t.d) {
n <- exp(nu)
a <- cos(t.a)^2
alpha <- n*a
gamma <- n*(1-a)
beta <- exp(log.b)
delta <- cos(t.d)^2 * beta
n - alpha * exp(-beta * x) - gamma * exp(-delta * x)
}
f.1 <- function(x, nu, t.a, log.b, t.d) {
n <- exp(nu)
a <- cos(t.a)^2
alpha <- n*a
beta <- exp(log.b)
alpha * (1 - exp(-beta * x))
}
f.2 <- function(x, nu, t.a, log.b, t.d) {
n <- exp(nu)
a <- cos(t.a)^2
gamma <- n*(1-a)
beta <- exp(log.b)
delta <- cos(t.d)^2 * beta
gamma * (1 - exp(-delta * x))
}
#
# The objective to minimize is the mean squared residual.
# This is equivalent to finding the MLE for Gaussian errors.
#
obj <- function(theta, x, y) {
crossprod(y - f(x, theta[1], theta[2], theta[3], theta[4])) / length(x)
}
#
# Create data and plot them.
#
x <- seq(0, x.max, length.out=n)
y <- g(x, alpha, beta, gamma, delta) + rnorm(length(x), 0, sigma)
plot(x,y, pch=16, col="#00000040", xlab="t")
#
# Fit the curve.
#
theta <- c(nu=log(max(y)/2), t.a=pi/4, log.b=log(max(x)/10), t.d=pi/4)
fit <- nlm(obj, theta, x=x, y=y, gradtol=1e-14)
theta.hat <- fit$estimate
#
# Plot relevant curves.
#
curve(g(x, alpha, beta, gamma, delta), add=TRUE, lwd=2)
curve(f(x, theta.hat[1], theta.hat[2], theta.hat[3], theta.hat[4]),
add=TRUE, col="Red", lwd=2)
curve(f.1(x, theta.hat[1], theta.hat[2], theta.hat[3], theta.hat[4]),
add=TRUE, col="Gray", lty=2, lwd=2)
curve(f.2(x, theta.hat[1], theta.hat[2], theta.hat[3], theta.hat[4]),
add=TRUE, col="Gray", lty=3, lwd=2)