是否有一种方法,以便在R中使用Optim()函数时,已经定义的参数可以显示为缺失



我正在尝试获得牙龈分布的最大似然估计器进行生存分析(我说,这样您就不会因log-ofikelihoodhoodhoodhoodhoodhoodhoodhood函数而天生认为它正确(。为了这样做,我必须通过使用"最佳函数"来最大化减去log-likelione,我尝试这样做,但是该控制台在FN(par,...(中给我一个错误(par,...(:参数" b"丢失,没有默认。

我也尝试以与此链接的答案相似的方式进行操作:求解最大的可能性,并在约束下使用两个参数,但是控制台游戏以下内容:Optim中的错误(C(1,1(,函数(x(log_lood(x [1],x [2],d =肺$状态,:: 最佳的目标函数评估长度0而不是1。

log_lhood <- function(m,b,d,t){                           
  sum<-0
  for (i in 1:length(lung)){ 
    if (d[i] == 1){
      sum<- sum - log(1-exp(-exp(-(t[i]-m)/b)))
    } else {
      sum<- sum - log((1/b)*exp(-(t[i]-m/b+exp(-(t[i]-m/b)))))
    }
  }
}
#a,b parameter optimization
optim(c(0,0), fn = log_lhood, d = lung$status, t = KM_fit$time) #1st way
optim(c(1, 1), function(x) log_lhood(x[1], x[2],d=lung$status,t=KM_fit_test$time)) #2nd way as in the link

这里有一些问题。该函数的第一个参数应该是参数的向量。另外,您需要nrow(lung)而不是length(lung),最好使用length(d)。另外,您不应该在此处使用循环,它效率很低,使用ifelse()(在R中,我们总是尝试将所有内容矢量化(。此外,您还需要检查是否可以计算出参数的所有值(例如b = 0(的日志可能性。您也忘记了return(sum)。另外sum是您不应该掩盖的有用功能。

这是运行的。

library(reprex)
lung <- data.frame(status=c(0,0,1,1))
KM_fit <- data.frame(time=c(0,1,2,3))
log_lhood <- function(x,d,t){
    m <- x[1]
    b <- x[2]
    sum <-0
    for (i in 1:nrow(lung)){
        if (d[i] == 1){
            sum <- sum - log(1-exp(-exp(-(t[i]-m)/b)))
        } else {
            sum <- sum - log((1/b)*exp(-(t[i]-m/b+exp(-(t[i]-m/b)))))
        }
    }
    return(sum)
}
#a,b parameter optimization
optim(par=c(0,1), fn = log_lhood, d = lung$status, t = KM_fit$time)
$par
[1] 1.661373 1.811780
$value
[1] 5.318068
$counts
function gradient 
      63       NA 
$convergence
[1] 0
$message
NULL

您可以这样重写您的功能。

log_lhood <- function(x,d,t){
    m <- x[1]
    b <- x[2]
    s <- ifelse(d==1,
                  -log(1-exp(-exp(-(t-m)/b))),
                  -log((1/b)*exp(-(t-m/b+exp(-(t-m/b)))))
                  )
    return(sum(s, na.rm=TRUE))
}

相关内容

  • 没有找到相关文章

最新更新