2016-06-28 10 views
0

私は、切り捨てガウス分布のモーメント(平均と分散)を表す2つの式を持っています。私はそれらを計算するために、以下の機能を建て:2つの非線形方程式をもつ解が与えられた場合のパラメータ値の検索R

musigma考える
trunc_moments <- function(moments, a, b){ 

    require(truncnorm) 

    mu <- moments[1] 
    sigma <- moments[2] 

    alpha <- (a - mu)/sigma; beta <- (b - mu)/sigma 

    mu_trunc <- mu + sigma* 
    ((dnorm(alpha, mu, sigma) - dnorm(beta, mu, sigma))/
     (pnorm(beta, mu, sigma) - pnorm(alpha, mu, sigma))) 

    sigma_trunc <- sigma^2 * (1 + 
     ((alpha*dnorm(alpha, mu, sigma) - beta*dnorm(beta, mu, sigma)) 
     /(pnorm(beta, mu, sigma) - pnorm(alpha, mu, sigma))) - 
     ((dnorm(alpha, mu, sigma) - dnorm(beta, mu, sigma)) 
     /(pnorm(beta, mu, sigma) - pnorm(alpha, mu, sigma)))^2) 

    return(c(mu_trunc, sigma_trunc)) 

} 

、機能はmu_truncsigma_truncを返します。

trunc_moments(c(0.25, 0.02), a=0, b=1) 

今、私は逆の結果を取得したいと思います。function、mu_truncsigma_trunc与え、私はmusigmaの値を取得することができますか?

私はnleqslv Rパッケージで何かを試しましたが、私はこれが私が探しているものではないかと思います。

library(nleqslv) 
nleqslv(c(0.25, 0.0004), trunc_moments, a = 0, b = 1)$x 
+0

pf 'trunc_moments'を呼び出すと、エラーメッセージが表示されます。 'trunc_moments'は引数' moments'のベクトルを期待しているので、 'trunc_moments(c(0.25、0.02)、a = 0、b = 1)'でなければなりません。 – Bhas

答えて

0

あなたtrunc_momentsの出力を受け取り、trunc_momentsするために必要な入力を計算する関数を記述する必要があります。あなたはそうのようにこれを行うことができます:

trunc_inverse <- function(minput,a,b) { 

    temp <- trunc_moments(minput,a,b) 
    y <- c(0.25,0.02) - temp 
    y 
} 

minputは機能trunc_momentsに、引数で渡されたmoments与えられた入力用trunc_momentsの結果です。 解決後の戻り値trunc_inverseは元の入力でなければなりません。しかし問題がある。

あなたがこれを行う場合:

nleqslv(c(0.25, 0.0004), trunc_inverse, a=0, b=1) 

出力の一部があなたの元の入力ではありません

$x 
[1] 0.2500000 0.1414214 

です。

あなたはtrunc_moments

このような
trunc_moments(c(0.25,0.1414214),a=0,b=1) 

の呼び出しでこれらの値を挿入した場合の結果は、だからあなたの本来の機能がmoments入力の異なる組み合わせのために同じ出力を与える

[1] 0.25000000 0.02000001 

です。これは、関数trunc_momentsが異なる入力に対して同じ出力を与えることを意味します。

あなたはいくつかの作業があります。

関連する問題