如何在R

时间:2015-08-02 10:44:16

标签: r for-loop optimization mle

我试图在R中实现以下Log-Likelihood函数。

Σ(i∈I)ln {Σ(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)
    
  3. 我收到以下错误:

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

    我花了大约3天的时间试图解决这个问题,我会感激任何帮助。谢谢,

1 个答案:

答案 0 :(得分:0)

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

说实话,你的问题现在非常分散。您的代码中有几个错误要求其他人调试,而不是单个有针对性的编程问题。如果这没有帮助,您可能需要稍微提炼出问题并更具体。