参数估计
参数估计是统计推断的一种,根据从总体中抽取的随机样本来估计总体分布中未知参数的过程;
参数估计又分为:点估计、区间估计;
- 点估计:用单个数值作为参数的估计,使用最多的包括最大似然估计和矩法;
- 区间估计:依据抽取的样本,根据一定的正确度与精确度要求,构造出适当的区间,作为总体分布的未知参数或参数函数的真值所在范围的估计。
通过一个例子看一下什么是参数估计:
已知一组数满足正态分布,反过来求解参数u和σ的过程称为参数估计。
例题
观测某型号20辆汽车消耗10L汽油的行驶里程数据如下:
59.6 | 55.2 | 56.6 | 55.8 | 60.2 | 57.4 | 59.8 | 56.0 | 55.8 | 57.4 |
56.8 | 54.4 | 59.0 | 57.0 | 56.0 | 60.0 | 58.2 | 59.6 | 59.2 | 53.8 |
假设行驶里程满足正态分布,用normfit函数求平均行驶里程的95%置信区间。
x= [59.6 55.2 56.6 55.8 60.2 57.4 59.8 56.0 55.8 57.4 56.8 54.4 59.0 57.0 56.0 56.0 59.6 59.2 53.8];
a=0.05;
[muhat,sigmahat,muci,sigmaci] = normfit(x,a);
常见分布的参数估计函数及其调用格式
分布 | 调用格式 |
---|---|
正态分布 | [muHat,sigmaHat,muCI,sigmaCI]=normfit(x,alpha) |
正态对数似然函数 | nlogL=normlike(params,x,censoring) |
最大似然估计 | phat=mle(data.‘distribution’,dist) |
贝塔分布 | [phat,pci]=betafit(data,alpha) |
二项分布 | [phat,pci]=binofit(x,n,alpha) |
指数分布 | [muhat,muci]=expfit(data,alpha) |
泊松分布 | [lambdahat,lambdaci]=poissfit(data) |
均匀分布 | [ahat,bhat,ACI,BCI]=unifit(data,alpha) |
卡方分布 | [phat,pci]=chisquarefit(data,df,alpha) |
点估计:
点估计就是用单个数值作为参数的估计,目前使用最多的是最大似然估计法和矩法。在此介绍最大似然估计法。
最大似然估计(maximum likehood estimates):
在待估参数的可能取值范围内,挑选使似然函数值最大时对应的参数值为最大似然估计量。
MATLAB的最大似然估计函数为:
phat=mle(data)
- 利用data指定的样本,返回正态分布的最大似然估计;
phat mle(data,‘distribution’,dist)
- 指定分布类型为dist;
例题:
依然是上述油耗问题,假设行驶里程数据服从正态分布,用最大似然估计法估计总体的均值和方差
x= [59.6 55.2 56.6 55.8 60.2 57.4 59.8 56.0 55.8 57.4 56.8 54.4 59.0 57.0 56.0 56.0 59.6 59.2 53.8];
a=0.05;
phat=mle(x,'distribution','normal');
muhatmle=phat(1);%均值
sigma2hatmle=phat(2)^2;%方差
区间估计:
求参数的区间估计,首先求出该参数的点估计,然后构造一个含有该参数的随机变量,并根据一定的置信水平求该估计值的范围。
MATLAB中使用mle函数进行区间估计时的调用格式为:
phat=mle(data,‘distribution’,dist,‘Alpha’,alpha)
- 指定分布类型为dist
例题:
依然是油耗问题,假设行驶里程数据服从正态分布,求平均行驶里程的95%置信区间。
x= [59.6 55.2 56.6 55.8 60.2 57.4 59.8 56.0 55.8 57.4 56.8 54.4 59.0 57.0 56.0 56.0 59.6 59.2 53.8];
a=0.05;
[phat,phi]=mle(x,'distribution','normal','Alpha',a);
muhatmle=phat(1);%均值
sigma2hatmle=phat(2)^2;%方差%置信区间
muhatci=muhatmle+norminv(0.5-a/2)*sigma2hatmle/sqrt(length(x));
muhatci=muhatmle-norminv(0.5-a/2)*sigma2hatmle/sqrt(length(x));