【问题标题】:Probability Density Functions in R for predicting next value of incidentsR中的概率密度函数用于预测事件的下一个值
【发布时间】:2014-01-30 02:05:41
【问题描述】:

我需要在 R 中对以下数据进行概率密度预测:

year = c(1971, 1984, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 
2007, 2008, 2009, 2010, 2011, 2012, 2013)
incidents = c(1, 1, 1, 1, 3, 1, 6, 6, 9, 11, 21, 37, 38, 275, 226, 774, 1064)

R 中的 data.frame 如下:

dat <- data.frame(year,incidents)

目标和想法是基于几年的预测,并“预测”可用数据的最后一年。

我是 R 新手,因此欢迎任何建议、建议等。 提前致谢。

【问题讨论】:

  • 嗨,欢迎来到堆栈溢出。一般来说,这里的人们喜欢看到表现出一些努力的问题。请考虑编辑
  • 是否有任何已知的理论方式表明这些年来事件数量有所增加?指数?对数?我认为您可能需要更多地考虑您想要从分析中得到什么。您可以使用数据运行 predict 并得到绝对无意义的结果,或者您不能。
  • 这里的问题是它没有完成数据,它不是偏差。它仍在持续过程中,但是,我需要有一些结果。除了上述问题,我还考虑了计算残差分析,请查看下面的直方图,让我知道我是否走在正确的道路上! !Residual Histogram.

标签: r probability prediction kernel-density probability-density


【解决方案1】:

广义而言,建模的两种主要方法是所谓的“机械”和“经验”方法。两者都有他们的追随者(和他们的批评者)。机制方法主张建模应该从对潜在现象(机制)的理解开始,然后将其转换为某种类型的数学方程,然后将其拟合到数据中(以测试机制)。经验方法组装了一个(通常很长的)模型(方程)列表,并试图找到“最适合”的模型。经验建模很吸引人,但也很危险,因为评估您何时“适合”并非易事——尽管它经常被这样对待。

您没有为我们提供足够的信息来制定机械模型,所以这里有几个经验模型的说明,作为一个警示故事:

Finite-time singularity models 在您的数据类型中很受欢迎。除其他外,这些模型用于“预测”stock market bubbles(LPPL 模型)。基本思想是灾难(奇点)即将来临,我们想预测何时。所以我们使用形式的函数:

y = a × (c-x)b

当 b c 处接近奇点。

在 R 代码中,我们可以像下面这样拟合模型:

# Finite-Time Singularity Model
library(minpack.lm)
f <- function(par,x) {
  a <- par[1]
  b <- par[2]
  c <- par[3]
  a * (c - x)^b
}
resid   <- function(par,obs,xx) {obs-f(par,xx)}
start <- c(a=1, b=-1, c=2100)
nls.out <- nls.lm(par=start, fn=resid, obs =dat$incidents, xx=dat$year, 
                  control = nls.lm.control(maxiter=500))
coef(nls.out)
with(dat, plot(incidents~year, main="Finite-Time Singularity Model"))
lines(dat$year,f(coef(nls.out),year), col=2, lwd=2)

这给出了看起来“非常合适”的东西:

事实上,该模型在早期夸大了事件,后来又倾向于低估它们(这很糟糕,因为我们想要对未来进行预测)。残差图清楚地表明了这一点。

with(dat,plot(year,resid(coef(nls.out),incidents,year),
              main="Residuals Plot", ylab="residuals"))

另一种方法指出您的数据是“计数”(例如每年的事件数)。这表明泊松族中的广义线性模型:

# generalized liner model, poisson family
fit.glm <- glm(incidents ~year,data=dat,family=poisson)
with(dat,plot(incidents~year))
lines(dat$year,predict(fit.glm,type="response"), col=2, lwd=2)
par(mfrow=c(2,2))
plot(fit.glm)

如诊断图所示,这种拟合更好,但仍然不是很好。残差呈趋势,它们不是正态分布的,并且一些数据点具有不可接受的高杠杆率。

【讨论】:

  • 非常感谢您提供如此出色的答案和努力。关于残差分析,我们在同一页面上,数据点确实具有不可接受的高杠杆率。另一方面,泊松族图提供了一个广义线性模型,我肯定需要考虑这一点。也非常感谢相关工作。
  • 能否分享以上四个地块(残差)的代码。提前谢谢!
【解决方案2】:
dat <- data.frame(year,incidents)
with(dat, plot(incidents~year))

所以有些事情发生了变化......但是是什么导致事件数量突然增加?只有你,科学家,有钥匙。您可能可以预测未来一两年会有一些增长,但这种增长是否会遵循指数或逻辑模式取决于研究的基础领域。如果您处于通常称为增长的“对数阶段”,则逻辑模型将不会非常准确,因为每年的事件上限是未知的。

【讨论】:

  • 谢谢,我去看看。
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2013-10-08
  • 2015-03-20
  • 1970-01-01
  • 2018-10-29
  • 2019-09-03
相关资源
最近更新 更多