2013-08-24 138 views
1

所以我一直在研究一个脚本来计算基于4个参数的对数似然性,并将它们放入一个特定的log-lik函数中。该脚本没问题。问题在于优化它 - 每当我尝试时,它都会说找不到对象(对于所讨论的参数)。为了简单起见,我将只使用一个更简单的脚本,它在使用optim()函数时给我一个相同的错误。有趣的是,我实际上是直接从“MLE in R”教程中取出这个脚本。我甚至没有重写它,我从字面上复制/粘贴PDF。这里是教程中的似然函数:R函数optim():找不到对象

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使我有以下错误:这下一行也被复制/教程粘贴

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()以便优化向量w?

回答

4

y是你的数据,你没有在你的代码中指定。因此,错误 Error in nrow(y) : object 'y' not found

如果你去同一个PDF文件的例子5和使用如下定义的数据y,你将有一个输出:

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

好是有道理的。但是,事情是,为什么如果y只依赖于前两个(如theta.true [1:2]部分所见),为什么用3个值定义theta.true?对于我的特定代码,只需输入一个包含4个值的向量w即可输出对数似然值。我想最大化这些,但我不知道如何做到这一点。 – saltthehash

+0

这里你正在做矩阵乘法,所以它需要服从矩阵乘法规则。查看上面的更新。 – Metrics