在R中给出具有两个非线性方程的解的参数值

时间:2016-06-28 09:42:09

标签: 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

1 个答案:

答案 0 :(得分: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的给定输入,

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

你还有一些工作要做。