使用MATLAB我遇到了以下问题:
设Z是对数正态分布,使得ln Z具有均值m和方差w。设eta为负数,c为正常数。
我试图计算期望值(让I(Z <= c)表示集合的指标函数(Z <= c))
E [Z ^(η+ 1)I(Z <= c)] =(1 / sqrt(w))integral_0 ^ cx ^(η)phi((ln x-m)/ sqrt(w)) DX,
其中phi()表示标准正态随机变量的概率分布函数。
我做的第一件事是模拟Z的10.000次试验,将值> c的向量的条目设置为0,升高到(eta + 1)的幂,然后计算平均值。这应该给我MC估计的预期值。
ST = random('Lognormal', m,w_sq,10000,1);
hlp = zeros(10000,1);
hlp(ST<=2) = ST(ST<=2);
hlp(hlp>0) = hlp(hlp>0).^(eta1+1); % 0^(eta1+1) gives infinity
mean(hlp)
对于积分,我使用了以下代码
tmpp = integral(@(x) x.^(eta1) .* normpdf((log(x)-m)/sqrt(w_sq),0,c);
tmpp / sqrt(w_sq(1))
不幸的是,程序会导致完全不同的结果,尽管在数学上它们应该是相同的。
这一切都是更大代码的一部分,使用积分版本对我来说会更方便。最初我试图使用MC模拟进行双重检查,然后发现某些东西一定是错的......
有人可以帮忙吗?
答案 0 :(得分:0)
对于第一段代码,
我猜你有意想不到的结果的原因就在于你 在
hlp
上进行计算,您尝试避免0值,因为0^eta
会爆炸 - 这不是想要的结果,所以你只需放弃它。 但在最后一步中,mean(hlp)
将获取数组hlp
中的所有值, 包括那些0。试试这个:
mean(hlp(hlp>0))
。我的结果大约是2.x,10,000点模拟,2.3x~ 2.4x,1,000,000分。
我错了。你的问题是你使用的点数太少了。尝试10,000,000点,你会感到满意:)
对于第二个问题,我在理解您定义变量的方式时遇到了问题。 (我没有足够的声誉来添加评论,所以我把它放在这里。)w_sq
中的“sq”是否表示w
的平方根?因为根据random
的文档,参数应该是“sigma”,这是标准偏差。将SD定义为方差的平方根是很自然的,我猜测它是w
。然后你在第一件事中做得对。
如果是这样,在代码的第二部分中,为什么要将sqrt()
放在w_sq
上?你的意思是取第四个方差吗?从你对期望的定义来看,我不认为这是正确的。请看一下。
另一方面,w_sq
是一个数字还是一个数组?
tmpp / sqrt(w_sq(1))
应为tmpp / sqrt(w_sq)
,尽管它们实际上没有区别。
您可能希望将所有代码放在for
循环中。循环遍历w_sq
,每次它挑选出数组中的一个元素(将变量命名为w_sq_elem
),然后让其余的代码执行就像它是单个的一样数。
无论如何,(log(x)-m)/sqrt(w_sq)
和tmpp / sqrt(w_sq(1))
会在w_sq
上提供不同的信息。第一个假定它是一个数字,因此除法可以只是/
,而不是./
。第二个表明它是一个数组,所以你选择它的第一个元素。但是数组在这里没有意义,因为根据我的理解,你不会在x
中将10,000个点除以10,000个不同的方差。
m = 3;
w_sq = 2;
eta1 = -2;
ST = random('Lognormal',m,w_sq,10000000,1);
hlp = zeros(10000000,1);
hlp(ST<=2) = ST(ST<=2);
hlp(hlp>0) = hlp(hlp>0).^(eta1+1); % 0^(eta1+1) gives infinity
mean(hlp)
tmpp = integral(@(x) x.^(eta1) .* normpdf((log(x)-m)/w_sq),0,2) ;
tmpp / w_sq
>> untitled
ans =
0.2944
ans =
0.2948
>>