概括地说,建模的两种主要方法是所谓的“机械”和“经验”方法。两者都有他们的追随者(和他们的批评者)。机制方法主张建模应该从对潜在现象(机制)的理解开始,然后将其转换为某种类型的数学方程,然后将其拟合到数据中(以测试机制)。经验方法组装了一个(通常很长的)模型(方程)列表,并试图找到“最适合”的模型。经验建模很吸引人,但也很危险,因为评估您何时“合身”并非易事——尽管它经常被这样对待。
你没有给我们足够的信息来制定一个机械模型,所以这里有几个经验模型的说明,作为一个警示故事:
有限时间奇点模型在您的数据类型中很受欢迎。除其他外,这些模型用于“预测”股市泡沫(LPPL 模型)。基本思想是灾难(奇点)即将来临,我们想预测何时。所以我们使用形式的函数:
y = a × (cx) b
当 b < 0 时,y 接近于 x -> 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)

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