2013-06-11 4 views
1

정상 분포와 로그 정규 분포를 혼합 한 모델을 만들어야합니다. 그것을 만들기 위해서, 로그 가능성 함수 (log-likelihood function)를 최대화하여 2 개의 공분산 행렬과 혼합 매개 변수 (총 = 7 개의 매개 변수)를 추정해야합니다. 이 최대화는 nlm 루틴에 의해 수행되어야합니다. 내가 상대 데이터를 사용하는 것처럼, 수단 알려진 1.이항 변수 정규 분포 정규 분포 정규 분포 모형의 파라미터 추정

동일 이미 1 개 차원에서 그것을 시도했다 (상대의 데이터를 1 개 세트로) 그것은 잘 작동하는

. 그러나 두 번째 상대 데이터 세트를 소개 할 때 상관 관계에 대한 비논리적 인 결과와 많은 경고 메시지 (모두 25 개)가 표시됩니다.

이 매개 변수를 계산하기 위해 먼저 dmvnorm 및 dlnorm.plus 명령을 사용하여 로그 가능성 함수를 정의했습니다. 그런 다음 매개 변수의 시작 값을 지정하고 마지막으로 nlm 루틴을 사용하여 매개 변수를 추정합니다 (아래 스크립트 참조).

`P <- read.ascii.grid("d:/Documents/JOINT_FREQUENCY/grid_E727_P-3000.asc", return.header= 
    FALSE); 
    V <- read.ascii.grid("d:/Documents/JOINT_FREQUENCY/grid_E727_V-3000.asc", return.header= 
    FALSE); 

p <- c(P); # tranform matrix into a vector 
v <- c(V); 

p<- p[!is.na(p)] # removing NA values 
v<- v[!is.na(v)] 

p_rel <- p/mean(p) #Transforming the data to relative values 
v_rel <- v/mean(v) 
PV <- cbind(p_rel, v_rel) # create a matrix of vectors 

L <- function(par,p_rel,v_rel) { 

return (-sum(log((1- par[7])*dmvnorm(PV, mean=c(1,1), sigma= matrix(c(par[1]^2, par[1]*par[2] 
*par[3],par[1]*par[2]*par[3], par[2]^2),nrow=2, ncol=2))+ 
par[7]*dlnorm.rplus(PV, meanlog=c(1,1), varlog= matrix(c(par[4]^2,par[4]*par[5]*par[6],par[4] 
*par[5]*par[6],par[5]^2), nrow=2,ncol=2))   ))) 

} 
par.start<- c(0.74, 0.66 ,0.40, 1.4, 1.2, 0.4, 0.5) # log-likelihood estimators 

result<-nlm(L,par.start,v_rel=v_rel,p_rel=p_rel, hessian=TRUE, iterlim=200, check.analyticals= TRUE) 

Messages d'avis : 

1: In log(eigen(sigma, symmetric = TRUE, only.values = TRUE)$values) : 
production de NaN 

2: In sqrt(2 * pi * det(varlog)) : production de NaN 

3: In nlm(L, par.start, p_rel = p_rel, v_rel = v_rel, hessian = TRUE) : 
NA/Inf replaced by maximum positive value 

4: In log(eigen(sigma, symmetric = TRUE, only.values = TRUE)$values) : 
production de NaN 

…. Until 25. 

par.hat <- result$estimate 

cat("sigN_p =", par[1],"\n","sigN_v =", par[2],"\n","rhoN =", par[3],"\n","sigLN_p =", par [4],"\n","sigLN_v =", par[5],"\n","rhoLN =", par[6],"\n","mixing parameter =", par[7],"\n") 

sigN_p = 0.5403361 

sigN_v = 0.6667375 

rhoN = 0.6260181 

sigLN_p = 1.705626 

sigLN_v = 1.592832 

rhoLN = 0.9735974 

mixing parameter = 0.8113369` 

누군가가 내 모델의 잘못 또는 어떻게 2 개 차원에서 이러한 매개 변수를 찾기 위해 무엇을해야하는지 알고 있나요?

제 질문에 시간을내어 주셔서 대단히 감사합니다. 내가 최적화 문제의 이러한 종류의 작업을 수행 할 때

감사합니다,

글래디스 헤르 초크 (Hertzog) 정권

답변

0

, 나는 그것이 내가 이상 최적화하고있어 모든 변수가 그럴듯한 값으로 제한되어 있는지 확인하는 것이 중요합니다 것을 찾을 수 있습니다. 예를 들어, 표준 편차 변수는 양수 여야하며, 모델링 상황에 대한 지식을 통해 모든 표준 편차 변수를 상한값으로 설정할 수 있습니다. 그래서 s 경우 내 표준 편차 변수 중 하나이며, m 내가 대신 내가

 
    s = m/(1+e-z) 
를 통해 s 관련이 변수 z에 대한 해결 것 s 작업의 취하려는 최대 값 인 경우

이 수식에서 z은 제한되지 않지만 s0m 사이에 있어야합니다. 변수가 그럴듯한 값을 취하도록 제약받지 않은 최적화 루틴은 솔루션을 바인딩하려고 시도하는 동안 종종 완벽하지 않은 값을 시도하기 때문에 이는 매우 중요합니다. 실용적이지 않은 값은 종종 예를 들어 정밀도, 그 다음 내가 ab 사이에 거짓말을 하나의 변수 x을 제약에 사용 NaN의 등 일반 식을 초래하면 공분산 찾고있는 특정 문제에 대한, 그러나

 
    x = a + (b - a)/(1+e-z) 

입니다 모든 개별 변수를 단순히 경계하는 것보다 더 정교한 접근이 필요합니다. 공분산 행렬은 양의 반 정량이어야하며, 행렬의 개별 값을 간단히 최적화하는 경우 양의 확률이 아닌 행렬이 우도 함수에 공급되면 최적화가 실패합니다 (NaN의 생성). 이 문제를 해결하기위한 한 가지 방법은 공분산 행렬 자체 대신에 공분산 행렬의 Cholesky decomposition을 푸는 것입니다. 아마도 이것이 귀하의 최적화 실패의 원인 일 것입니다.