gpt4 book ai didi

prediction - 评估零膨胀负二项式模型的性能

转载 作者:行者123 更新时间:2023-12-02 17:28:38 30 4
gpt4 key购买 nike

我正在使用零膨胀负二项式模型(包:pscl)对电影通过联系网络(基于电话数据)的传播进行建模

m1 <- zeroinfl(LENGTH_OF_DIFF ~ ., data = trainData, type = "negbin")

(下面描述的变量。)下一步是评估模型的性能。

我尝试进行多次样本外预测并计算 MSE。

使用

predict(m1, newdata = testData)

我收到了每个数据点的扩散链平均长度的预测,并使用

predict(m1, newdata = testData, type = "prob")

我收到一个矩阵,其中包含每个数据点具有特定长度的概率。

评估问题:由于我有一个 0(和 1)膨胀的数据集,如果模型预测所有值均为 0,则大多数情况下该模型都是正确的。我收到的预测对于长度为零的链(根据 MSE)来说是好的,但是对于长度为 1 或更大的链,预测值和真实值之间的偏差很大。

我的问题是:

  • 我们如何评估我们的模型预测非零长度链的效果?
  • 这种方法是从零膨胀负二项式模型进行预测的正确方法吗?
    • 如果是:我该如何解释这些结果?
    • 如果否:我可以使用什么替代方案?
<小时/>

我的变量是:

  • 因变量:
    • 扩散链的长度(计数 [0,36])
  • 自变量:
    • 电影特征(虚拟变量和连续变量)。

谢谢!

最佳答案

评估 RMSPE(均方根预测误差)很简单,但最好事先转换计数,以确保真正的大计数不会主导该总和。

您可能会发现假阴性和假阳性错误率(FNR 和 FPR)在这里很有用。 FNR 是实际非零长度的链被预测为零长度(即缺失,也称为负)的机会。 FPR 是实际零长度的链被错误预测为非零(即正)长度的机会。我建议对这些术语进行谷歌搜索,找到您最喜欢的定量期刊中的一篇论文或书中有助于简单解释这些术语的章节。对于生态学家,我倾向于回顾 Fielding & Bell(1997,环境保护)。首先,让我们定义一个可重复的示例,任何人都可以使用(不确定您的 trainData 来自哪里)。这是来自 pscl 库中 Zeroinfl 函数的帮助:

    # an example from help on zeroinfl function in pscl library
library(pscl)
fm_zinb2 <- zeroinfl(art ~ . | ., data = bioChemists, dist = "negbin")

R 中有几个包可以计算这些。但这是手动方法。首先计算观测值和预测值。

    # store observed values, and determine how many are nonzero
obs <- bioChemists$art
obs.nonzero <- obs > 0
table(obs)
table(obs.nonzero)

# calculate predicted counts, and check their distribution
preds.count <- predict(fm_zinb2, type="response")
plot(density(preds.count))

# also the predicted probability that each item is nonzero
preds <- 1-predict(fm_zinb2, type = "prob")[,1]
preds.nonzero <- preds > 0.5
plot(density(preds))
table(preds.nonzero)

然后得到混淆矩阵(FNR、FPR的基础)

    # the confusion matrix is obtained by tabulating the dichotomized observations and predictions
confusion.matrix <- table(preds.nonzero, obs.nonzero)
FNR <- confusion.matrix[2,1] / sum(confusion.matrix[,1])
FNR

在校准方面,我们可以通过目视或通过校准来完成

    # let's look at how well the counts are being predicted
library(ggplot2)
output <- as.data.frame(list(preds.count=preds.count, obs=obs))
ggplot(aes(x=obs, y=preds.count), data=output) + geom_point(alpha=0.3) + geom_smooth(col="aqua")

转换计数以“查看”正在发生的情况:

    output$log.obs <- log(output$obs)
output$log.preds.count <- log(output$preds.count)
ggplot(aes(x=log.obs, y=log.preds.count), data=output[!is.na(output$log.obs) & !is.na(output$log.preds.count),]) + geom_jitter(alpha=0.3, width=.15, size=2) + geom_smooth(col="blue") + labs(x="Observed count (non-zero, natural logarithm)", y="Predicted count (non-zero, natural logarithm)")

在您的情况下,您还可以评估预测计数和实际计数之间的相关性,包括或排除零。

因此,您可以将回归作为一种校准来评估这一点!但是,由于预测不一定是计数,因此我们不能使用泊松回归,所以我们可以使用对数正态,通过回归对数假设正常响应,根据观察到的日志进行预测。

    calibrate <- lm(log(preds.count) ~ log(obs), data=output[output$obs!=0 & output$preds.count!=0,])
summary(calibrate)
sigma <- summary(calibrate)$sigma
sigma

我认为有更多奇特的方法来评估校准,就像在任何建模练习中一样......但这只是一个开始。

要对零膨胀模型进行更高级的评估,请在为 Zeroinfl 函数提供的引用文献中查看对数似然的使用方法。这需要一点技巧。

关于prediction - 评估零膨胀负二项式模型的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30103001/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com