首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零膨胀负二项分布模型的性能评估

零膨胀负二项分布模型的性能评估
EN

Stack Overflow用户
提问于 2015-05-07 13:46:05
回答 1查看 1.1K关注 0票数 4

我正在用一个零膨胀负二项分布模型(包: pscl)通过一个联系网络(基于电话数据)来模拟电影的传播。

代码语言:javascript
复制
m1 <- zeroinfl(LENGTH_OF_DIFF ~ ., data = trainData, type = "negbin")

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

我的尝试是做多个样本外预测和计算MSE。

使用

代码语言:javascript
复制
predict(m1, newdata = testData)

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

代码语言:javascript
复制
predict(m1, newdata = testData, type = "prob")

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

问题:由于我有一个0(和1)膨胀的数据集,如果它对所有值预测为0,那么模型大部分时间都是正确的。对于长度为零的链(根据MSE),我收到的预测是好的,但是对于长度1或更长的链,预测值和真实值之间的偏差是很大的。

我的问题是:

  • 我们如何评估我们的模型如何预测非零长度的链?
  • 这种方法是用零膨胀负二项分布模型进行预测的正确方法吗?
    • 如果是,,我如何解释这些结果?
    • 如果不是,,我能用什么替代方案?

我的变量是:

  • 因变量:
    • 扩散链长度(计数0,36)

  • 自变量:
    • 电影特征(包括假人和连续变量)。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-02-22 06:08:46

评估RMSPE (均方预测误差)是很简单的,但最好是事先转换计数,以确保真正的大计数不会支配这个总数。

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

代码语言:javascript
复制
    # an example from help on zeroinfl function in pscl library
    library(pscl)
    fm_zinb2 <- zeroinfl(art ~ . | ., data = bioChemists, dist = "negbin")

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

代码语言:javascript
复制
    # 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的基)。

代码语言:javascript
复制
    # 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

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

代码语言:javascript
复制
    # 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")

将计数转换为“查看”正在发生的事情:

代码语言:javascript
复制
    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)")

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

因此,您可以拟合回归作为一种校准来评估这一点!然而,由于预测不一定是计数的,所以我们不能使用泊松回归,因此我们可以使用对数正态分布,方法是将日志预测与观察到的日志进行回归,假设是正常的响应。

代码语言:javascript
复制
    calibrate <- lm(log(preds.count) ~ log(obs), data=output[output$obs!=0 & output$preds.count!=0,])
    summary(calibrate)
    sigma <- summary(calibrate)$sigma
    sigma

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

要对零膨胀模型进行更高级的评估,请在为zeroinfl函数提供的参考资料中查看日志可能性的使用方法。这需要一点技巧。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30103001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档