2016-06-28 63 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将为不同的输入提供相同的输出。

你有一些工作要做。

相关问题