预测均值和标准差

时间:2014-03-21 18:07:11

标签: r statistics distribution regression forecasting

道歉,如果这是一个简单的问题,但过去一周我无法找到任何答案,这让我发疯了。

背景信息:我有一个数据集可以跟踪5年内5个人的体重。每年,我都有一个分组中个体的权重,我从中计算平均值和标准差。数据如下:

 Year = [2002,2003,2004,2005,2006]
 Weights_2002 = [12, 14, 16, 18, 20]
 Weights_2003 = [14, 16, 18, 20,20]
 Weights_2004 = [16, 18, 20, 22, 18]
 Weights_2005 = [18, 21, 22, 22, 20]
 Weights_2006 = [2, 21, 19, 20, 20]

问题:如何预测未来10年该群体的年度体重分布?理想情况下,我希望随着时间的推移,平均值的不确定性会增加。同样,我也希望标准差的不确定性也会增加。换句话说,我想预测权重的分布,这两个方面都是:

  1. 数据中的自然差异
  2. 增加不确定性。
  3. 非常感谢任何帮助。如果有人可以在R中建议如何做到这一点,那就更好了。

    谢谢你们!

1 个答案:

答案 0 :(得分:4)

如果没有关于如何在R中使用预测工具的具体建议,对您的问题的评论,这里是使用蒙特卡罗模拟的替代方法。

首先,一些内务管理:2中的Weights_2006值是拼写错误或异常值。由于我无法分辨哪一个,我将假设它是一个异常值并将其从分析中排除。

其次,您说您希望根据increasing uncertainty投影分发。但是你的数据并不支持。

Year <- c(2002,2003,2004,2005,2006)
W2   <- c(12, 14, 16, 18, 20)
W3   <- c(14, 16, 18, 20,20)
W4   <- c(16, 18, 20, 22, 18)
W5   <- c(18, 21, 22, 22, 20)
W6   <- c(NA, 21, 19, 20, 20)
df   <- rbind(W2,W3,W4,W5,W6)
df   <- data.frame(Year,df)

library(reshape2)   # for melt(...)
library(ggplot2)
data <- melt(df,id="Year", variable.name="Individual",value.name="Weight")
ggplot(data)+
  geom_histogram(aes(x=Weight),binwidth=1,fill="lightgreen",colour="grey50")+
  facet_grid(Year~.)

平均体重随着时间的推移而增加,但方差减少。查看各个时间序列可以了解原因。

ggplot(data, aes(x=Year, y=Weight, color=Individual))+geom_line()

一般来说,一个人的体重随时间线性增加(每年约2个单位),直到它达到20,当它停止增加但是波动时。由于您的初始分布是均匀的,因此体重较轻的个体会随着时间的推移而增加,从而推动平均值。但是较重的人的体重停止增长。因此,分布在20左右“聚集”,导致方差减小。我们可以在数字中看到这一点:增加均值,降低标准偏差。

smry <- function(x)c(mean=mean(x),sd=sd(x))
aggregate(Weight~Year,data,smry)
#   Year Weight.mean  Weight.sd
# 1 2002  16.0000000  3.1622777
# 2 2003  17.6000000  2.6076810
# 3 2004  18.8000000  2.2803509
# 4 2005  20.6000000  1.6733201
# 5 2006  20.0000000  0.8164966

我们可以使用蒙特卡罗模拟对此行为进行建模。

set.seed(1)
start <- runif(1000,12,20)
X <- start
result <- X
for (i in 2003:2008){
  X <- X + 2
  X <- ifelse(X<20,X,20) +rnorm(length(X))
  result <- rbind(result,X)
}
result <- data.frame(Year=2002:2008,result)

在这个模型中,我们从1000个人开始,他们的体重在12到20之间形成均匀分布,就像你的数据一样。在每个时间步,我们将权重增加2个单位。如果结果> 20,我们将其剪辑为20.然后我们添加分布为N [0,1]的随机噪声。现在我们可以绘制分布图。

model <- melt(result,id="Year",variable.name="Individual",value.name="Weight")
ggplot(model,aes(x=Weight))+
  geom_histogram(aes(y=..density..),fill="lightgreen",colour="grey50",bins=20)+
  stat_density(geom="line",colour="blue")+
  geom_vline(data=aggregate(Weight~Year,model,mean), aes(xintercept=Weight), colour="red", size=2, linetype=2)+
  facet_grid(Year~.,scales="free")

红色条显示每年的平均重量。

如果您认为个体体重的自然变化会随着时间的推移而增加,那么请使用N[0,sigma]作为模型中的错误字词,sigma随着Year的增加而增加。问题是您的数据中没有任何内容可以支持这一点。