1

我的代码有点卡住了,如果有人可以帮助我,我将不胜感激!

下面的代码基本上是我编写的一个函数,它使您能够根据具有参数 μ、σ2 和 τ 的截断正态分布的 iid 样本 x1、...、xn 计算 μ 和 σ2 的最大似然估计值,其中τ 的值是已知的。

这是我到目前为止的代码。

tnorm.negll <- function(theta,xbar,SS,n,tau){

  #storing variance into a more appropriate name
  sigmasq <- theta[2]
  logvar <- log(sigmasq)

  if (sigmasq<0) {
  warning("Input for variance is negative")
  return(Inf)
  }
  
  #storing mean into a more appropriate name
  mu <- theta[1]
  
  #standard normal
  phi <- function(x) exp(-x^2/2)/sqrt(2*pi)

  #using the given formula for the negative log-likelihood
  negloglike <- (n/2)*(logvar) + (SS - 2*n*mu*xbar + n*mu^2)/(2*sigmasq) + n*log(1-phi((tau-mu)/(sqrt(sigmasq))))

  #returning value:
      return(negloglike)

}

我现在需要编写另一个函数,比如 trnorm.MLE(),它将使用上面的函数来计算 μ 和 σ2 的最大似然估计,给定一个观测向量 x1、...、xn 和 τ 值。

我决定我的函数应该有以下参数:

  • x:观察向量,
  • tau :阈值,
  • theta0:向量,元素为 theta0[1] 初始猜测 mu 和 theta0[2] 初始猜测 sigmasq。

理想情况下,trnorm.MLE() 函数应该返回一个长度为 2 的向量,其中第一个分量是 μ 的 MLE,第二个分量是 σ2 的 MLE。

作为猜测,我写了这个:

x <- rep(1:11, c(17,48,68,71,42,19,14,7,1,0,1))
tau <- 3
theta0 <- c(3,15)

xbar <- mean(x)
SS <- sum(x^2)
n <- length(x)
nlm(tnorm.negll,theta0,xbar,SS,n,tau,hessian = TRUE)

我知道这远非正确,但我无法正确表达!我收到各种错误

nlm 中的错误(tnorm.negll,theta0,xbar,SS,n,tau,hessian = TRUE):“nlm”优化器中的函数值无效

或者

if (theta[2] >= 0) { 中的错误:需要 TRUE/FALSE 的缺失值

谢谢您阅读此篇。希望有人可以指导我完成这个?

此致。

编辑:更改了 tnorm.negll 返回结果的方式

4

0 回答 0