我试图在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")
我现在的问题是:
如何编码前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天的时间试图解决这个问题,我会感激任何帮助。谢谢,
答案 0 :(得分:0)
要使参数总和为1,您可以执行params[12] <- 1 - params[1:11]
之类的操作。对于log(sum(llh))
的问题,这意味着sum(llh)
不是正面的,或者您的函数没有返回数字...事实上,我认为您的一些问题可能源于您的{{1}函数返回一个函数,而不是一个值。尝试执行beta_llh
或return(res)
。然后,对于与return(sum(llh))
相关的错误,上一行应为llh_All[s] = llh_S
...但您必须弄明白llh_S = beta_llh(err_mat)(par)
应该是什么。
说实话,你的问题现在非常分散。您的代码中有几个错误要求其他人调试,而不是单个有针对性的编程问题。如果这没有帮助,您可能需要稍微提炼出问题并更具体。