0

적분과 관련된 확률을 풀고 2 개의 매개 변수에 대한 헤센 행렬을 얻기 위해 R에서 optim()을 사용하는 데 문제가 있습니다. 알고리즘이 수렴되었지만 optim()에서 hessian = TRUE 옵션을 사용하면 오류가 발생합니다. 에러는 다음에optim()의 헤 시안 행렬 R

오류 통합 (integrand1, 저급 =의 S1을 [I] - 1, 상부 =의 S1 [I]) 비 한정도 수 NAs

의 경고 메시지가 있었다

함수 값 당신의 도움에 대한

s1=c(1384,1,1219,1597,2106,145,87,1535,290,1752,265,588,1188,160,745,237,479,39,99,56,1503,158,916,651,1064,166,635,19,553,51,79,155,85,1196,142,108,325 
,135,28,422,1032,1018,128,787,1704,307,854,6,896,902) 

LLL=function (par) { 

    integrand1 <- function(x){ (x-s1[i]+1)*dgamma(x, shape=par[1], rate=par[2]) } 
    integrand2 <- function(x){ (-x+s1[i]+1)*dgamma(x, shape=par[1],rate=par[2]) } 



    likelihood = vector() 

    for(i in 1:length(s1)) {likelihood[i] = 
    log(integrate(integrand1,lower=s1[i]-1,upper=s1[i])$value+ integrate(integrand2,lower=s1[i],upper=s1[i]+1)$value) 
    } 

    like= -sum(likelihood) 
    return(like) 

} 




optim(par=c(0.1,0.1),LLL,method="L-BFGS-B", lower=c(0,0)) 
optim(par=c(0.1,0.1),LLL,method="L-BFGS-B", lower=c(0,0), hessian=TRUE) 

감사 :

여기 내 코드입니다!

+0

's1 [2] -1' (0)에서'i == 2'를 적분 할 때'dgamma (0, shape = .1, scale = .1))를's1 [2]'(1)에 적용한다. 's1'에서'1'을 제외하면 어떻게됩니까? – Thales

+0

@Thales 감사합니다. –

+0

어제 'lower = c (.001, .001)'를 사용했다고 들었습니다. 왜 당신은 '저급'이라는 주장에 그것을 사용하지 않습니까? 'lower '를'c (0.01,0.01)'로 변경하면 헤 시안이 보입니다. – Bhas

답변

0

optim은 기능을 최소화합니다. 인수 rate을 사용하여 우도 함수를 그릴 수 있습니다. 음모를 꾸미려면 약간의 바이올린이 필요합니다. 는 이런 식으로 작업을 수행 : 당신은 함수가 rate 가장 낮은 값에 대한 최소한의 것을 볼 수

z2 <- function(rate) { 
    par <- numeric(2) 
    par[1] <- .68 
    par[2] <- rate 
    y <- LLL(par) 
    y 
} 

z1 <- Vectorize(z2,vectorize.args="rate") 

curve(z1, from=.001,to=1) 

. from.1으로 변경하면 동일합니다. 견적이 유효한지 판단 할 수 없습니다.

+0

다시 한번 큰 도움을 주셔서 감사합니다. –