2016-06-28 2 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'는'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(c(0.25,0.1414214),a=0,b=1) 

같은 trunc_moments의 호출에이 값을 삽입하는 경우

결과는

[1] 0.25000000 0.02000001 

그래서 원래 기능은 moments 입력의 다른 조합에 대해 동일한 출력을 제공합니다. 이것은 함수 trunc_moments이 다른 입력에 대해 동일한 출력을 제공함을 의미합니다.

일부 작업이 있습니다.