利用MATLAB实现正态参数估计及分布检验

本文包括以下内容:

  • 三道题的分析与代码实现
  • 实验值与理论值的比较
  • 完整代码附录

题目 1  利用均匀分布U[-1,1],使用中心极限定理产生正态分布的随机数1000个,其中每次用来产生正态分布随机数的均匀分布样本容量个数 ≥ 50。

理论分析


由中心极限定理可知, 随机变量X1,X2, ......Xn独立同分布,且具有有限的数学期望和方差,则下面公式中的Yn将近似地服从标准正态分布N(0,1)。
 
因此我们可以利用-1到1的均匀分布得到一系列Xi,随后分别产生1000个近似服从标准正态分布的单个随机数。

MATLAB代码实现详解


仅利用MATLAB中的rand()函数来产生均匀分布的随机数
由于rand()函数仅产生(0,1)区间的均匀分布,因此还需做一些处理如下:
function result = my_rand()
  below_zeros = -rand(1,50);
  above_zeros = rand(1,50);
  rand_sum = sum(below_zeros) + sum(above_zeros);
  total = 100;
  result = (rand_sum - total*0.5) / (10*total*total/12);
end
上方我们自定义的函数(非MATLAB内置的)是用于产生标准正态分布的单个随机数,所以循环执行该函数1000次并将其返回结果添加至数组之中就得到了我们需要的符合正态分布的随机数组rand_x。
rand_x = [];
for  time = 1:1000
    rand_x = [rand_x,my_rand()];
end
 
题目 2  在产生的1000个随机数中,均匀随机地抽取一个容量为100的样本。选择有效的点估计量给出基于该样本的总体均值和方差的点估计值,并将其与理论的推导的值比较。

理论分析


这一步涉及到了借助样本来估计总体的未知参数,也就是点估计。
在这里采用了矩估计的方法,由于总体矩可以表现为未知参数的函数,我们用样本矩去替换总体矩,就构建了样本矩与未知参数的关系式。
由以上公式可看出正态分布中的两个参数都可以由样本矩的式子表示出来,从而实现了对未知总体参数的估计。

MATLAB代码实现详解


第二题中需要随机抽取容量为100的样本。
index = [];
for time = 1:1000
    index = [index,time]; %产生1~1000的下标数组
end
rand_index = randperm(1000,100); %产生1~1000的100个不重复的随机下标
sample = [];
for time = 1:100
    sample = [sample,rand_x(rand_index(time))];
end
计算基于该样本估计的总体均值与方差:
predict_ex = sum(sample)/100; %由样本估计出的均值
sample1 = sample.^2; %将sample数组中的每一个值都平方
square_sum = sum(sample1);
predict_dx = square_sum/100 - predict_ex*predict_ex;
%由样本估计的方差
 
题目 3  基于抽取的容量的为100的样本给出总体均值和方差的置信度为0.95的置信区间,并考察总体参数是否落在置信区间内。

理论分析


这一步中要给出总体参数的置信区间。
我们先在方差未知的情况下求均值的置信区间,有双侧置信区间公式如下图所示:
该公式中n为样本容量100,由置信度=0.95,可知 α为0.05,查t分布表可知t0.025(99) = 1.9842
然后在均值未知情况下求方差的置信区间, 有双侧置信区间公式如下图所示:
该公式中n为样本容量100,由置信度=0.95,可知 α为0.05,同样的我们去查卡方分布表也能知道公式中有关量的具体值。

MATLAB代码实现详解


第三题中代入公式计算基于样本的总体均值和方差的置信区间。
left_ex = predict_ex - 1.9842*sqrt(predict_dx)/10;
%均值置信区间左侧
right_ex = predict_ex + 1.9842*sqrt(predict_dx)/10;
%均值置信区间右侧
left_dx = (99*predict_dx)/128.422;
%方差置信区间左侧
right_dx = (99*predict_dx)/73.361;
%方差置信区间右侧

实验值与理论值比较


 
第一次运行结果展示:
可以看出由样本估计的均值为0.0103,由样本估计的方差为0.8851。
均值的置信区间为(-0.1764,0.1970),方差的置信区间为(0.6823,1.1944)。
 
第二次运行结果展示:
可以看出由样本估计的均值为0.1013,由样本估计的方差为0.7502。
均值的置信区间为(-0.0706,0.2731),方差的置信区间为(0.5783,1.0124)。
 
总体均值与方差的理论值是0和1,这两次运行的样本估计值与理论值已经比较接近,且都落在了置信区间中。

完整代码附录


 
%产生标准正态分布,该部分涉及的my_rand()函数定义在最后
rand_x = [];
for time = 1:1000
    rand_x = [rand_x,my_rand()];
end
%样本抽取
index = [];
for time = 1:1000
    index = [index,time];
end
rand_index = randperm(1000,100);
sample = [];
for time = 1:100
    sample = [sample,rand_x(rand_index(time))];
end
%参数估计
predict_ex = sum(sample)/100;
sample1 = sample.^2;
square_sum = sum(sample1);
predict_dx = square_sum/100 - predict_ex*predict_ex;
%求置信区间
left_ex = predict_ex - 1.9842*sqrt(predict_dx)/10;
right_ex = predict_ex + 1.9842*sqrt(predict_dx)/10;
left_dx = (99*predict_dx)/128.422;
right_dx = (99*predict_dx)/73.361;
%展示结果数据
disp(left_ex);
disp(right_ex);
disp(left_dx);
disp(right_dx);
disp(predict_ex);
disp(predict_dx);
%自定义函数用于产生单个正态分布随机数
function result = my_rand()
  below_zeros = -rand(1,50);
  above_zeros = rand(1,50);
  rand_sum = sum(below_zeros) + sum(above_zeros);
  total = 100;
  result = (rand_sum - total*0) / (10*4/12);
end
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页