我需要对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的新人,所以欢迎任何建议,建议等等。 提前致谢。
答案 0 :(得分:1)
从广义上讲,建模的两种主要方法是所谓的“机械”和“经验”方法。他们都有他们的追随者(和他们的批评者)。机械方法断言建模应该从对基本现象(机制)的理解开始,然后将其转化为某种类型的数学方程,然后将其与数据拟合(以测试机制)。经验方法汇集了一个(通常很长的)模型列表(方程式),并试图找到“最适合”的模型。经验模型很有吸引力但很危险,因为评估何时“适合”并不是微不足道的 - 尽管通常会采用这种方式。
你没有给我们足够的信息来形成一个机械模型,所以这里有一些经验模型的例子,作为一个警示故事:
Finite-time singularity models受您的数据类型欢迎。除此之外,这些模型用于“预测”stock market bubbles(LPPL模型)。基本的想法是灾难(奇点)即将到来,我们想要预测何时。所以我们使用以下形式的函数:
y = a×(c-x) b
b 0,y接近奇点,因为x - >角
在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)
这种拟合更好,但仍然不是很好,正如诊断图显示的那样。残差遵循趋势,它们不是正态分布的,并且一些数据点具有不可接受的高杠杆率。
答案 1 :(得分:0)
dat <- data.frame(year,incidents)
with(dat, plot(incidents~year))
所以有些事情发生了变化......但是如果发生事故,导致数量突然增加的原因是什么?只有你,科学家,才有钥匙。您可以预测,未来一两年会有一些增长,但这种增长是否会遵循指数或逻辑模式,这取决于潜在的研究领域。如果你处于通常所谓的增长“对数阶段”,那么逻辑模型就不会非常准确,因为每年事件的上限是未知的。