我的模型基于以下增长函数:x_t + 1 = x_t + r * x_t *(1 - x_t / K)增长率r由每年随机抽取定义(平均值= 0.2,标准差= 0.2)。我观察了700次运行后10000次运行的库存x的概率密度函数。当我计算概率密度函数下的面积时,对于0.1的标准偏差,它大致等于1,但对于0.2或0.3的标准偏差则不大。我为区域A创建了一个100个值的直方图。它在A = 2处显示非常高的峰值,但是区域的值甚至达到8.为什么它不等于1?
runs=10000
mean=0.2
sd=0.2
K=1
x_0=0.4
v=0.1
t=70
y=c()
x=x_0
for (j in 1:runs) {
rand=rnorm(t,mean,sd)
for (i in 1:t) {
x=max(x+rand[i]*x*(x-v)*(1-x/K),0)
if(i==t)
y[j]=x
next}
x=x_0
next }
library(sfsmisc)
Dens=density(y)
f=approxfun(Dens$x, Dens$y)
h=c()
i=seq(0.9, 1, length.out=100000)
for (e in 1:length(i)) {
h[e]=f(i[e])
next}
options(max.print=1000000)
h[is.na(h)]=0
area=sum(abs(h[-1]+h[-length(h)])/2*diff(i))
谢谢!
答案 0 :(得分:0)
你的数值整合存在严重缺陷。
首先,这是密度图:
几乎所有地区都在一个非常狭窄,令人难以置信的高峰值下面。绝大多数的样本点都不在那个峰值之内,因此不能很好地估计该峰值的区域。
如果您评估print(Dens)
,您会看到:
Call:
density.default(x = y)
Data: y (10000 obs.); Bandwidth 'bw' = 1.734e-06
x y
Min. :0.9922 Min. : 0.0
1st Qu.:0.9942 1st Qu.: 0.0
Median :0.9961 Median : 0.0
Mean :0.9961 Mean : 439.1
3rd Qu.:0.9981 3rd Qu.: 0.0
Max. :1.0000 Max. :91131.2
特别注意x值的所有是> 0.99,但是您在区间[.9,1]上使用数值积分。因此,您的大部分数值积分都超出了密度范围。您正在[范围[0.9,0.99]中使用(通过approxfun
)外推值,并且远远超出(相对而言)数据范围。因此,90%的数值积分是基于两个几乎为零的值(前两个y值)的不可靠外推。
您需要找到一些重新调整数据的方法。对density
本身的调用存在问题。它使用(默认情况下)512个点,但是如果你看它们,只有几十个y
值明显大于0.你试图通过大多数采样尾巴来获得分布的图片而不是发生重大事件的价值观。