我使用零膨胀负二项模型(包: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 :(得分:2)
评估RMSPE(均方根预测误差)是直截了当的,但最好先预先计算你的计数,以确保真正的大数不会占据这个总和。
您可能会发现假阴性和假阳性错误率(FNR和FPR)在这里很有用。 FNR是预测实际非零长度链具有零长度(即,不存在,也称为负)的机会。 FPR是错误地预测实际零长度链具有非零(即正)长度的机会。我建议按照这些条款在谷歌上找到你最喜欢的量化期刊上的论文,或者在书中帮助解释这些内容的章节。对于生态学家,我倾向于回到Fielding&amp;贝尔(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函数提供的参考资料中查看可以使用对数似然的方法。这需要一点技巧。