我有两个方程来描述截断高斯分布的矩(均值和方差)。我构建了以下函数来计算它们:
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
和sigma
,该函数返回mu_trunc
和sigma_trunc
。
trunc_moments(c(0.25, 0.02), a=0, b=1)
现在,我想得到相反的结果:给定函数mu_trunc
和sigma_trunc
,我可以获得mu
和sigma
的值吗?
我尝试了nleqslv R包,但我不确定这是我要找的。 p>
library(nleqslv)
nleqslv(c(0.25, 0.0004), trunc_moments, a = 0, b = 1)$x
答案 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
的给定输入, 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
将为不同的输入提供相同的输出。
你还有一些工作要做。