我有一个对数似然函数我希望优化并理解我可以在R中使用optim()
这样做。我的函数所需的参数是一个概率向量(长度为N
)as以及大小为N*N
的对称矩阵(由于对称性,只有N-choose-2(现在N = 5)值很重要。)
当我尝试使用optim()
时,收到以下错误:
optim中的错误(params,L):( list)对象无法强制键入' double'
为什么我收到此错误,我该如何使用? (如果在Matlab或Python中有更好的解决方案,也欢迎使用这些语言的函数的参考或建议) 这是代码:
numerator <- function(P, Gamma, y, U, N) {
expr = 1
for (i in 1:N-1) {
for ( j in i+1:N) {
if ((y[i] == y[j]) & (y[i] == 1)) {
expr = expr*P[i]*P[j]*exp(Gamma[i,j])
}
if ((y[i] != y[j]) & (y[i] == 1)) {
expr = expr*P[i]*(1 - P[j])
}
if ((y[i] != y[j]) & (y[i] == 0)) {
expr = expr*(1 - P[i])*P[j]
}
if ((y[i] == y[j]) & (y[i] == 0)) {
expr = expr*(1 - P[i]*P[j]*exp(Gamma[i,j]) - P[i]*(1 - P[j]) - (1 - P[i])*P[j])
}
}
}
return(expr)
}
denominator <- function(params, y, U, N) {
P <- params$probs
val <- 1
for (i in 1:N-1) {
val <- val*(y[i]*P[i]^(N-3) + (1-y[i])*(1 - P[i])^(N-3))
}
val <- val * y%*%P + (1 - y)%*%(1 - P)
return(val)
}
L <- function(params, y, U, N) {
P <- params$probs
Gamma <- params[,2:(N+1)]
n <- log(numerator(P, Gamma, y, U, N))
d <- log(denominator(P, y, U, N))
l <- n-d
return(l)
}
y <- readRDS(file="purchase_records_df.rds")
N <- ncol(y)
params <- data.frame('probs'=rep(0.001, N), 'gamma'=matrix(0,nrow=N,ncol=N))
optim(params, L)
简单地说,设置是y是购买的向量,但在这里我们想要获取我们的购买数据并找到潜在的概率。
非常感谢!