The goal

在固定的Mu上优化跨数据组的公共分散参数,其中Mu按组变化.

The problem

我有n=10组数据,我假设每组数据都是负二项分布的随机样本,固定的$Mu=mi$.

# 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)参数.所以我想要优化联合最大似然法,超过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))
}

然后我try 将其传递给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,

What works:

如果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的内部 struct 太过复杂,在某个时刻迫切需要重构……)

将数据转换为带有GROUP-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相关问答推荐

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

如何在R中描绘#符号?

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

R Select()可以测试不存在的子集列

以相同的方式对每个表进行排序

将二进制数据库转换为频率表

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

具有重复元素的维恩图

从R中的对数正态分布生成随机数的正确方法

在多页PDF中以特定布局排列的绘图列表不起作用

如何平滑或忽略R中变量的微小变化?

根据r中另一个文本列中给定的范围对各列求和

按组跨多列创建伪变量

如何显示准确的p值而不是<;0.001*?

我需要使用ggplot2制作堆叠条形图

如果满足条件,则替换列的前一个值和后续值

在不重复主题的情况下重新排列组

重写时间间隔模糊连接以减少内存消耗

根据向量对列表元素进行排序

R中的交叉表