请问如何用matlab对一列数据画出对数正态分布曲线,并得到如下图所示的参数

我的数据地址是('工作簿数据.xlsx','sheet2','G2:G106556')

close all;
clear all;
data = xlsread('工作簿数据.xlsx','sheet2','g2:g106556'); %读入数据
%测试数据 data = lognrnd(8,.7,10000,1);
[y x]=hist(data,200);   %统计频次分布
h=bar(x,y,1);  %画直方图
hold on;

%对数正态分布密度函数
fun=@(p,x) p(1)./x.*exp(-((log(x)-p(2))/p(3)).^2/2);
%A=p(1),mu=p(2),sigma=p(3)

[maxy ind]=max(y); 
%做非线性数据拟合
p=nlinfit(x,y,fun,[maxy*x(ind),log(x(ind)),1]);

%画拟合曲线
x1 = min(x):0.01:max(x);
yfit=fun(p,x1); 
plot(x1,yfit,'r','linewidth',1);

%极大似然处 x=exp(mu-sigma^2);
xmax=exp(p(2)-p(3)^2);
ymax=fun(p,xmax);
plot([xmax xmax],[0 ymax],'g','linewidth',2);

%期望值处 x=exp(mu+sigma^2/2)
xmean=exp(p(2)+p(3)^2/2);
ymean=fun(p,xmean);
plot([xmean xmean],[0 ymean],'c','linewidth',2);

xlim([min(x) max(x)]);
xlabel('BC浓度(ng/m^3)');
ylabel('频数');
legend('统计数据',['对数正态分布:\mu=' num2str(p(2)) ',\sigma=' num2str(p(3))],...
    ['极大概然分布位置:x=' num2str(xmax)],['期望值位置:x=' num2str(xmean)]);
text(xmean+10000,ymean+10,'$ y=\frac{A}{x}e^{-\frac{(lnx-\mu)^2}{2\sigma^2}} $',...
    'interpreter','latex','FontSize',18);

追问

大神好厉害啊,请问能用matlab对拟合效果进行检验吗

追答

logn_cdf=[data, cdf('logn',data,8,.7)];% 求累计概率
H0:符合指数分布
h= kstest(data,logn_cdf) %缺省alpha=0.05
h=0:不能拒绝H0,

追问

大神,得不出来检验效果啊

追答

你的数据不是指数分布的吧

追问

数据看趋势是符合对数正态分布的吧,而且我的样本比较大,有十几万条,我现在主要想对拟合效果进行检验,看看数据是否符合对数正态分布。我看别人说大数据样本用ks检验误差大,要随机抽取数进行检验。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答