1

我正在尝试在 R 中实现以下对数似然函数。

∑<em>(i∈I)ln{∑</em>(s∈S)p(s)* p_i(s)}

变量 p_i(s) 给出的(err_mat[i,j]*(1-Beta) + Beta*(1-err_mat[i,j]) 变量 p(s) 是过程 s 的概率,最多有 12 个可能的过程。

我写了一个关于如何计算 pi_s 的简单表示,它取决于一个未知参数:beta。优化函数的输入是一个“错误”矩阵(0 或 1),并估计哪个数据生成过程最有可能适合数据。有 12 个可能的过程可以产生数据,给出 12 个概率 p_s,限制在 (0,1) 之间,并且应该总和为 1 以进行估计。还有第 13 个参数 beta,它捕获了过程中的噪声。

到目前为止,在stackoverflow上进行了大量搜索,我有以下功能:

  `beta_llh <- function(err_mat) {
    nr <- dim(err_mat)[1]
    nl <- dim(err_mat)[2]
    pi_s = c(rep(1,12))
    function(pars) {
     for (i in 1:nr){
      for (j in 1:nl){
        pi_s[i] = pi_s[i] * (err_mat[i,j]*(1-Beta) + Beta*(1-err_mat[i,j]))
      }

       pi_s[i] = pi_s[i]*p_s[i] # multiply pi_s by p_s
    }

    result = sum(llh) # MAKE a sum for the pi_s and p_s 
  }
 }`

样本误差矩阵如下:

err_matrix = matrix(c(rep(0,40), rep(1,440)), nrow=12, ncol=40, byrow= TRUE)

我目前的优化功能是:

optim(par=c(rep(0,13)), fn=llh_value, lower=c(rep(0,13)),upper=c(rep(1,13)), method = "L-BFGS-B")

我现在的问题是:

  1. 我如何编码前 12 个参数总和为 1 的约束。

  2. 鉴于我在内部求和中已经有一个未知参数,我如何对外部求和进行编码。当我尝试使用下面的代码将内部求和传递到外部 for 循环时,出现错误。

    llh_All <- matrix(rep(1,2), nrow=2, ncol=1 )
    for(s in 1:n){
      dataS = subset(testDF, testDF$ID1 == "s")
      # get its error matrix
      err_mat  <- get_err_matrix(dataS)
      # get its llh
      llh_S = beta_llh(err_mat)
      llh_All[s] <- llh_S
      }
    result = sum(llh_All)
    

我收到以下错误:

    Error in llh_All[s] = llh_S : 
    incompatible types (from closure to double) in subassignment type fix

我花了大约 3 天的时间试图自己解决这个问题,我将不胜感激。谢谢,

4

1 回答 1

0

要使参数总和为 1,您可以执行类似params[12] <- 1 - params[1:11]. 对于 的问题log(sum(llh)),这意味着它sum(llh)不是正数或者您的函数没有返回数字......事实上,我认为您的一些问题可能源于您的beta_llh函数返回一个函数,而不是一个值。尝试做return(res)return(sum(llh))。然后,对于与 相关的错误llh_All[s] = llh_S,上一行应该是llh_S = beta_llh(err_mat)(par)... 但你必须弄清楚你par应该是什么。

老实说,你的问题目前很分散。您的代码中有几个错误需要其他人进行调试,而不是一个单一的、有针对性的编程问题。如果这没有帮助,您可能需要稍微提炼问题并更具体。

于 2015-08-02T17:32:46.313 回答