所以我一直在研究脚本,根据具体的4个参数计算对数似然,并将它们放入特定的log-lik函数中。那个剧本很好。问题在于优化它 - 每当我尝试时,它都说无法找到对象(对于有问题的参数)。为了简单起见,我将使用一个更简单的脚本,当我使用optim()函数时,它会给我一个相同的错误。有趣的是,我实际上直接将这个脚本从" MLE in R"教程。我甚至没有重写它,我从PDF中复制/粘贴它。以下是教程中的似然函数:
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
这让我意识到它正在谈论y是一个特定于函数内部的对象,而不是一个全局对象,但同时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?
答案 0 :(得分: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