我正在尝试在 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")
我现在的问题是:
我如何编码前 12 个参数总和为 1 的约束。
鉴于我在内部求和中已经有一个未知参数,我如何对外部求和进行编码。当我尝试使用下面的代码将内部求和传递到外部 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 天的时间试图自己解决这个问题,我将不胜感激。谢谢,