计算蒙特卡罗估计的方差

时间:2014-01-24 15:27:46

标签: matlab montecarlo

我想估计R_LW的方差,这是估计量LW与标准OLS估计量的均方误差(MSE)之比(R代表比率)。

每个MSE计算超过5000个sims,得到一个R_LW。我想知道比率R_LW的估计值的标准偏差是多少。

为了估计这一点,我重复该过程100次以获得100个R_LW的估计值,然后计算产生的100个R_LW的方差。我所看到的是,在100次模拟中连续产生的R_LW值往往非常相似,导致整体方差低3.81E-06。

然而,当我重新运行整个过程时,它产生另外100个R_LW的估计值,虽然它们彼此接近并产生与第一组相似的方差,但它们波动的平均值往往比两种运行的估计方差都表明。

鉴于方差为3.8106,这相当于0.001953的标准偏差,因此我不希望在100次sims中看到超过3个标准偏差的运动,实际上在一次模拟运行中你看不到大于横跨100个样本。

然而,当你看到不同运行之间的R_LW时,它的平均值会移动很多!见下文

Run1 0.6133
Run2 0.5901
Run3 0.6169
Run4 0.5833
Run5 0.6161
Stdev 0.016

之间的运行标准差几乎高出10倍?我猜它与normrnd()的播种方式有什么关系?

 clear;
 tic
dim=1;
flag=0;
n=30;
p1=3;
p2=2;
alpha1=0.9;
alpha2=0.9;
error_vol=1^0.5;

MSE_OLS=0;
MSE_R=0;

MSE_OLS_tot=0;
MSE_LW_tot=0;
MSE_OLS_AVR=0;
MSE_R_AVR=0;
SUM_STD_MSE_OLS=0;
SUM_STD_MSE_R=0;
STD_OLS=0;
STD_R=0;

nsims=5000;
tot_p=p1+p2;
x=zeros(n,tot_p);

for i=1:n
 z_i4=normrnd(0,1);
 for j=1:p1     
     x(i,j)=x(i,j)+alpha1*z_i4;
     x(i,j)= x(i,j)+(1-alpha1^2)^(0.5)*normrnd(0,1);
   end

 for j=1+p1:tot_p        
     x(i,j)=x(i,j)+alpha2*z_i4;
     x(i,j)= x(i,j)+(1-alpha2^2)^(0.5)*normrnd(0,1);
 end
end

mu= mean(x,dim);
sigma = std(x,flag,dim);
sigma0 = sigma;
sigma0(sigma0==0) = 1;
x_scaled = bsxfun(@minus,x, mu);
sigma0=sigma0*sqrt(n-1);
x_scaled = bsxfun(@rdivide, x_scaled, sigma0);

econFlag=0;
[U,sigma,coeff] = svd(x_scaled,econFlag);
b_act=coeff(:,1);

sigmax = std(x,flag,dim);
mu_x=mean(x,dim);
nrepl=100;

R_LW_tot=0;
R_LW_sq=0;
R_LW_var=0;

for vv=1:nrepl

for t=1:nsims

residuals=normrnd(0,error_vol,n,1);


y=x*b_act + residuals;

mu_y=mean(y,dim);
mu_y=mu_y*ones(n,1);
sigmay = std(y,flag,dim);

mu= mean(y,dim);
sigma = std(y,flag,dim);
sigma0 = sigma;
sigma0(sigma0==0) = 1;
y_scaled = bsxfun(@minus,y, mu);
sigma0=sigma0*sqrt(n-1);
y_scaled = bsxfun(@rdivide, y_scaled, sigma0);

b=x_scaled\y_scaled;    
[b_LW k_LW]=LW(y_scaled, x_scaled);

for i=1:tot_p
    b_LW(i)=b_LW(i)*sigmay/sigmax(i);
end


MSE_OLS=(b-b_act)'*(b-b_act);
MSE_LW=(b_LW-b_act)'*(b_LW-b_act);

MSE_OLS_tot=MSE_OLS_tot+MSE_OLS;
MSE_LW_tot=MSE_LW_tot+MSE_LW;

end


MSE_OLS_AVR=MSE_OLS_tot/nsims;
MSE_LW_AVR=MSE_LW_tot/nsims;



R_LW=MSE_LW_AVR/MSE_OLS_AVR;    
R_LW_store(vv)=R_LW;
R_LW_tot=R_LW_tot+R_LW;
R_LW_sq=R_LW_sq+R_LW^2;
end

R_LW_var=(R_LW_sq)-(R_LW_tot^2/nrepl)/(nrepl-1);

toc

LW:

function [b k]=LW(y,x)

[n, p]=size(x);

dim=1;
flag=0;

b=x\y;

y_hat=x*b;
r=(y-y_hat);
s_squared=(r'*r)/(n-p-1);%s_squared=(r'*r)/(n-p-1);

econFlag=0;
[U,sigma,coeff] = svd(x,econFlag);%[U,sigma,coeff] = svd(z,econFlag);
EV=sigma.^2;

k=p*s_squared/(b'*x'*x*b);
pseudo = sqrt(k) * eye(p);
x_ridge  = [x;pseudo];
y_ridge  = [y;zeros(p,1)];

b = x_ridge\y_ridge;

end

0 个答案:

没有答案