2016-06-28 64 views
0

我有兩個方程描述了截斷高斯分佈的矩(均值和方差)。我內置下面的函數來計算它們:給出帶有兩個非線性方程的解的給定參數值R

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)) 

} 

鑑於musigma,該函數返回mu_truncsigma_trunc。現在

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

,我想獲得相反的結果:給定功能,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(c(0.25,0.02),a = 0,b = 1)',因爲'trunc_moments'需要一個用於參數'moments'的向量。 – 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 
} 

minputtrunc_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) 

結果是

[1] 0.25000000 0.02000001 

所以你的原始功能得到相同的輸出爲moments輸入的不同組合。這意味着您的功能trunc_moments將爲不同的輸入提供相同的輸出。

你有一些工作要做。