2013-08-24 2 views
1

그래서 저는 4 개의 매개 변수를 기반으로 로그 가능성을 계산하고 특정 log-lik 함수에 넣기 위해 스크립트 작업을 해왔습니다. 그 스크립트는 괜찮습니다. 문제는 그것을 최적화하는 것입니다. 시도 할 때마다 문제의 매개 변수에 대한 개체를 찾을 수 없다고합니다. 간단히하기 위해 optim() 함수를 사용할 때 동일한 오류를주는 훨씬 간단한 스크립트 만 사용합니다. 재미있는 부분은 실제로이 스크립트를 "MLE in R"자습서에서 직접 가져온 것입니다. 필자는 다시 작성하지 않았으며, 문자 그대로 PDF에서 복사/붙여 넣기했습니다. 튜토리얼의 우도 함수는 다음과 같습니다.R 함수 optim() : object not found

normal.lik1<-function(theta,y){ 
mu<-theta[1] 
sigma2<-theta[2] 
n<-nrow(y) 
logl<- -.5*n*log(2*pi) -.5*n*log(sigma2) - (1/(2*sigma2))*sum((y-mu)**2) 
return(-logl) 
} 

이 함수는 자체적으로 완벽하게 작동합니다. 그러나 최적화하려고 할 때 개체를 찾을 수 없다는 오류가 발생합니다. 개체는 최적화하려고하는 매개 변수입니다.

optim(c(0,1),normal.lik1,y=y,method="BFGS") 

내가이 줄을 실행하면, R은 나에게 다음과 같은 오류를 제공합니다 :이 다음 줄은/튜토리얼에서 붙여 복사 즉시 내가 그것을 어떻게 Y에 대해 이야기하고 있음을 깨닫게했다

Error in nrow(y) : object 'y' not found 

전역 함수가 아니라 함수 내에있는 객체입니다. 그러나 동시에 optim() 함수는 그 함수를 평가해야합니다! 그래서, 왜 y가 존재하지 않는 것처럼 행동하는지 모르겠습니다.

편집 :

이제 어떻게 작동하는지 이해합니다. 하지만 전반적인 목표에 여전히 문제가 있습니다. 관점에 더 많은 말하면, 여기에 내가 지금 함께 일하고 코드입니다 :

w.loglik<-function(w){ 
    # w is just a vector with 4 values: two means (w(1) and w(2) below) and the position 
    # of two decision bounds (w(3) and w(4)) 

    #create data matrix 
    data<-matrix(c(140,36,34,40,89,91,4,66,85,5,90,70,20,59,8,163),nrow=4,ncol=4,byrow=TRUE) 

    # get means 
    means<-matrix(0,4,2,byrow=TRUE) 
    means[2,1]<-w[1] 
    means[3,2]<-w[2] 
    means[4,1]<-w[1] 
    means[4,2]<-w[2] 

    # get covariance matrices (fix variances to 1) 
    covmat<-list() 
    covmat[[1]]<-diag(2) 
    covmat[[2]]<-diag(2) 
    covmat[[3]]<-diag(2) 
    covmat[[4]]<-diag(2) 

    # get decision bound parameters 
    b<-diag(2) 
    c<-matrix(c(w[3],w[4]),2,1) 

    L<-matrixloglik(data,means,covmat,b,c) 
    return(L) 
} 

matrixloglik 그냥 로그 가능성을 (이 잘 실행)를 출력하는 기능입니다. 어떻게하면 벡터를 최적화 할 수 있도록 optim()을 실행할 수 있습니까?

답변

4

y은 귀하의 데이터이며 코드에 명시하지 않았습니다. 따라서이 같은 pdf 파일의 예 5 가지 아래 정의 된 데이터 y를 사용하면 출력이됩니다 Error in nrow(y) : object 'y' not found

오류 :

X<-cbind(1,runif(100)) 
theta.true<-c(2,3,1) 
y<-X%*%theta.true[1:2] + rnorm(100) 

> optim(c(0,1),normal.lik1,y=y,method="BFGS") 
$par 
[1] 3.507266 1.980783 

$value 
[1] 176.0685 

$counts 
function gradient 
     49  23 

$convergence 
[1] 0 

$message 
NULL 

Warning messages: 
1: In log(sigma2) : NaNs produced 
2: In log(sigma2) : NaNs produced 
3: In log(sigma2) : NaNs produced 

참고 : "An Introduction to R"을 참조하세요 기능의 기초를 이해하십시오.

업데이트는 : 의견에 따라 : 당신은 일을 시도하고 어떻게되는지 볼 수 있습니다

y<-X%*%theta.true++ rnorm(100) 
Error in X %*% theta.true : non-conformable arguments 
+0

감각을 좋아 만드는. 그 이유는, theta.true가 theta.true [1 : 2] 부분에서 볼 수있는 것처럼 첫 번째 2에만 종속적 인 경우 theta.true가 3 개의 값으로 정의되는 이유는 무엇입니까? 내 특정 코드의 경우, 4 개의 값을 포함하는 벡터 w를 입력하여 로그 우도를 출력합니다. 나는 이것들을 극대화하고 싶지만 어떻게해야할지 모르겠다. – saltthehash

+0

여기서 행렬 곱셈을하고 있으므로 행렬 곱셈 규칙을 따라야합니다. 위의 업데이트를 참조하십시오. – Metrics