从拟合的 glmmTMB 模型模拟 negbin 数据 - family negbin1
Simulate negbin data from a fitted glmmTMB model - family negbin1
我使用 family = nbinom1
安装了一个 glmmTMB
模型。现在我想根据预测值和分散度对数据进行模拟。但是,从帮助文件来看,go-to rnbinom
函数似乎使用了 family=nbinom2
参数化,其中方差等于 mu + mu^2/size
.
1) 谁能帮我弄清楚如何模拟 family=nbinom1
数据(其中方差等于 mu + mu*size
)?
2) 另外,我提取/使用色散值作为大小是否正确?
非常感谢!
当前代码(未提供数据,因为无关紧要),使用 stats:::rnbinom
函数,尽管方差定义不匹配:
library(glmmTMB)
mod <- glmmTMB(y ~ x + (1 | ID), data = df, family = nbinom1)
preds <- predict(mod, type = "response")
size <- sigma(mod)
sim <- rnbinom(nrow(df), mu = preds, size = size)
我们可以尝试模拟nbinom1,所以如果方差为mu + mu*k:
set.seed(111)
k = 2
x = runif(100,min=1,max=3)
y = rnbinom(100,mu=exp(2*x),size=exp(2*x)/k)
ID = sample(1:2,100,replace=TRUE)
df = data.frame(x,y,ID)
mod <- glmmTMB(y ~ x + (1 | ID), data = df, family = nbinom1)
sigma(mod)
[1] 1.750076
在上面,对于每个均值 mu,我指定了一个 mu / k 的大小,以便它给出 mu*k 的预期方差。这表明只要你正确地参数化了rnbinom,你就得到了rnbinom1。
现在有了这个模型,如果我们需要模拟数据,只需使用与上面相同的参数化:
preds <- predict(mod, type = "response")
size <- sigma(mod)
sim <- rnbinom(nrow(df), mu = preds, size = preds/size)
plot(sim,df$y)
这里有各种各样的问题,包括:
sigma(mod)
给出残差的估计标准差;它不是方差,而是方差的平方根,因此您可能需要对其进行平方。
- 负二项分布的参数化超出了 R 的版本,但在 R 的版本中,如果均值为
mean(dat)
且方差为 var(dat)
,则您可以估计 size
mean(dat)^2/(var(dat)-mean(dat))
和 prob
的概率 mean(dat)/var(dat)
rnbinom()
将容忍 size
为非整数或无限,尽管这是理论上的废话;它不会容忍 size
为负数,如果 var(dat)
小于 mean(dat)
就会发生这种情况。它还会出现平均值为负或 size
为零的问题。
所以也许你可以考虑调整你的模拟线以适应
sizes <- ifelse(sigma(mod) ^ 2 > preds, preds ^ 2 / (sigma(mod) ^ 2 - preds), Inf)
sim <- ifelse(preds > 0, rnbinom(nrow(df), mu = preds, size = sizes), 0)
那么当 sigma(mod)
小于或等于 preds
时,您可能仍然会出错
我使用 family = nbinom1
安装了一个 glmmTMB
模型。现在我想根据预测值和分散度对数据进行模拟。但是,从帮助文件来看,go-to rnbinom
函数似乎使用了 family=nbinom2
参数化,其中方差等于 mu + mu^2/size
.
1) 谁能帮我弄清楚如何模拟 family=nbinom1
数据(其中方差等于 mu + mu*size
)?
2) 另外,我提取/使用色散值作为大小是否正确?
非常感谢!
当前代码(未提供数据,因为无关紧要),使用 stats:::rnbinom
函数,尽管方差定义不匹配:
library(glmmTMB)
mod <- glmmTMB(y ~ x + (1 | ID), data = df, family = nbinom1)
preds <- predict(mod, type = "response")
size <- sigma(mod)
sim <- rnbinom(nrow(df), mu = preds, size = size)
我们可以尝试模拟nbinom1,所以如果方差为mu + mu*k:
set.seed(111)
k = 2
x = runif(100,min=1,max=3)
y = rnbinom(100,mu=exp(2*x),size=exp(2*x)/k)
ID = sample(1:2,100,replace=TRUE)
df = data.frame(x,y,ID)
mod <- glmmTMB(y ~ x + (1 | ID), data = df, family = nbinom1)
sigma(mod)
[1] 1.750076
在上面,对于每个均值 mu,我指定了一个 mu / k 的大小,以便它给出 mu*k 的预期方差。这表明只要你正确地参数化了rnbinom,你就得到了rnbinom1。
现在有了这个模型,如果我们需要模拟数据,只需使用与上面相同的参数化:
preds <- predict(mod, type = "response")
size <- sigma(mod)
sim <- rnbinom(nrow(df), mu = preds, size = preds/size)
plot(sim,df$y)
这里有各种各样的问题,包括:
sigma(mod)
给出残差的估计标准差;它不是方差,而是方差的平方根,因此您可能需要对其进行平方。- 负二项分布的参数化超出了 R 的版本,但在 R 的版本中,如果均值为
mean(dat)
且方差为var(dat)
,则您可以估计size
mean(dat)^2/(var(dat)-mean(dat))
和prob
的概率mean(dat)/var(dat)
rnbinom()
将容忍size
为非整数或无限,尽管这是理论上的废话;它不会容忍size
为负数,如果var(dat)
小于mean(dat)
就会发生这种情况。它还会出现平均值为负或size
为零的问题。
所以也许你可以考虑调整你的模拟线以适应
sizes <- ifelse(sigma(mod) ^ 2 > preds, preds ^ 2 / (sigma(mod) ^ 2 - preds), Inf)
sim <- ifelse(preds > 0, rnbinom(nrow(df), mu = preds, size = sizes), 0)
那么当 sigma(mod)
小于或等于 preds