r - 如何使用不同(但固定)均值最大化联合似然函数

标签 r mathematical-optimization mle probability-distribution

目标

优化固定 mu 上数据组之间的通用离散参数,其中 mu 按组变化。

问题

我有 n=10 组数据,我假设每组数据都是来自具有固定 $mu=m_i$ 的负二项式分布的随机样本。

# Simulate data in hand: 

# N=10 vectors of variable length
# fixed data:
N <- 10
ns <- sample(1:100, N)
# fixed means:
mus <- sample(1:100, N)
list_v <- lapply(1:N, function(i){ rnbinom(ns[i], size=3, mu=mus[i]) })
list_mu <- as.list(mus)

我想估计所有组都共有的分散(大小)参数。所以我想优化 size 参数的联合最大似然。我编写了一个函数 negjloglik_nbinom ,它可以处理不同的 mu 参数:

# Define functions:

loglik_nbinom <- function(v, size, m){
  log(dnbinom(v, mu=m, size=size))
}

neg_jloglik_nbinom <- function(disp, v_list, mu_list){
  # Likelihood for mean m
  ind_lls <- list()
  for(i in 1:length(v_list)){
    ind_lls[[i]] <- loglik_nbinom(size=disp, v=v_list[[i]], m=mu_list[[i]])
  }
  # log(product(likelihoods)) == sum(log(likelihoods))
  (-1)*sum(unlist(ind_lls))
}

然后我尝试将其传递给 bbmle::mle2:

  fit <- bbmle::mle2(minuslogl=neg_jloglik_nbinom,
                     start=c(disp=3),
                     fixed=list(v_list=list_v,
                                mu_list=list_mu)
                     )

这会引发一个奇怪的错误:

Error in bbmle::mle2(minuslogl = neg_jloglik_nbinom, start = c(disp = 3),  : 
  some named arguments in 'fixed' are not arguments to the specified log-likelihood function:v_list1, v_list2, v_list3, v_list4, v_list5, v_list6, v_list7, v_list8, v_list9, v_list10, v_list11, v_list12, v_list13, v_list14, v_list15, v_list16, v_list17, v_list18, v_list19, v_list20, v_list21, v_list22, v_list23, v_list24, v_list25, v_list26, v_list27, v_list28, v_list29, v_list30, v_list31, v_list32, v_list33, v_list34, v_list35, v_list36, v_list37, v_list38, v_list39, v_list40, v_list41, v_list42, v_list43, v_list44, v_list45, v_list46, v_list47, v_list48, v_list49, v_list50, v_list51, v_list52, v_list53, v_list54, v_list55, v_list56, v_list57, v_list58, v_list59, v_list60, v_list61, v_list62, v_list63, v_list64, v_list65, v_list66, v_list67, v_list68, v_list69, v_list70, v_list71, v_list72, v_list73, v_list74, v_list75, v_list76, v_list77, v_list78, v_list79, v_list80, v_list81, v_list82, v_list83, v_list84, v_list85, v_list86, v_list87, v_list88, v_list89, v_list90, v_list91,

什么有效:

如果 v_listmu_list 没有作为函数参数传递,而是由 neg_jloglik_nbinom 找到它们,那么优化最终不会成为问题在环境中。这看起来并不理想,但如果有必要的话我会忍受它!

# Rewrite objective function without list args:
neg_jloglik_nbinom <- function(disp){
  # Likelihood for mean m
  ind_lls <- list()
  for(i in 1:length(v_list)){
    ind_lls[[i]] <- loglik_nbinom(size=disp, v=v_list[[i]], m=mu_list[[i]])
  }
  # log(product(likelihoods)) == sum(log(likelihoods))
  (-1)*sum(unlist(ind_lls))
}

# Assign lists to vars in environment:
v_list=list_v
mu_list=list_mu

# Compute optimization without specifying any fixed parameters:
fit <- bbmle::mle2(minuslogl=neg_jloglik_nbinom,
                   start=c(disp=3))

最佳答案

发生错误的原因是bbmle正在内部将参数转换为向量...(bbmle的内部结构太复杂,迫切需要在某些时候进行重构...)

如何使用组 ID 因子将数据转换为长格式并使用 data 参数传递信息?

## convert to long format
dd <- data.frame(v = unlist(list_v), 
                 f = factor(rep(1:length(list_v), lengths(list_v))))
dd$mu <- unlist(list_mu[dd$f])
## fit
mle2(v ~ dnbinom(mu = mu, size = exp(logsize)), 
         data = dd,
         start = list(logsize = 0))

如果您想要拟合均值而不是将其固定为已知值,则可以使用 parameters= 参数来拟合每个组的不同均值……?

glmmTMB中,您可以使用map=start=参数来指定固定参数值...

## convert to long format
dd <- data.frame(v = unlist(list_v), 
                 f = factor(rep(1:length(list_v), lengths(list_v))))
## fit
mle2(v ~ dnbinom(mu = exp(logmu), size = exp(logsize)),
     parameters = list(logmu ~ f - 1),
     data = dd,
     start = list(logmu = 0, logsize = 0))

关于r - 如何使用不同(但固定)均值最大化联合似然函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75858331/

相关文章:

R 版本 3.5.2 或最新 R 版本的 rtexttools 软件包替代品

matlab - 使用 mle() 估计自定义分布的参数

r - conditionalPanel Shiny 隐藏复选框选项

python - 如何最大化 Python Gekko 中的目标函数?

mathematical-optimization - 遗传算法

php - MySQL 存储过程中的数学公式返回不正确的值

r - 包 `fitdistr()`中的 `fitdistrplus`函数拟合的幂律

machine-learning - 如何使用 MLE 来训练 n-gram 模型?

r - 创建一个新变量,该变量从现有的数据框中获取不同的列,取决于分组变量

r - 如何在 Azure 上交互式运行 Docker 容器