【Matlab1】统计



2013年01月08日    Author:Guofei

文章归类: Matlab    文章编号: 11001

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2013/01/08/matlab1.html


1. 统计

1.1 描述性统计

基本操作:
画图后,点tool 点datastatistics 点save to workspace

[值,行号]=max(x,[],1)
[值,列号]=max(x,[],2)
sum(x,1),sum(x,2),sum(x,3);min;max;mean同理

排序

[sA,index] = sort(A,'descend',dim)

描述性统计量

median %中位数   
mode %众数  
var     
std %标准差    
range %极差
var %方差,返回的是每一列的var
std %标准差   
moment %中心距

mean %平均值  
nanmean %忽略nan的平均数
geomean %几何平均
harmmean %调和平均

kurtosis(x) %峰度   
skewness %偏度

%分位数:
Q1=prctile(w,25);Q3=prctile(w,75);


cov() %协方差,返回协方差矩阵
corrcoef() %协方差

绘图

  • 箱图
    Boxplot (x,notch1,sym1,vert)
    Notch1=1凹口notch=0矩形
    Sym1='* '    sym1='+'
    Vert=0%水平
    
  • cdf图
    x=random('unif',0,1,500,1);
    [f,x0]=ecdf(x)
    plot(x0,f)
    % 等价于这段代码:
    [h,stat]=cdfplot(x)%  统计量
    
  • gscatter:类似plotpv的效果,但是可以取0,1以外的值,也可以取多个值
    x=1:100;x=x'
    y=3*x+random('norm',10,100,100,1)
    ind=[ones(25,1);0*ones(25,1);2*ones(50,1)];
    gscatter(x,y,ind)
    
  • plotpv
    plotpv(p,t)
    

核密度估计


[f,xi]=ksdensity(x)%xi等分100份,f对应核密度估计
f=ksdensity(x,xi)%xi处的核密度估计值f
ksdensity(...)%只画图
....

其它图

histfit  条形图,带拟合的

y=normpdf(x,mean(s),std(s));plot(x,y);   %画正态分布图

normplot        wblplot
qqplot
pareto%帕累托图
gscatter%散度图
tabulate(x)%频率表
cdfplot(x)%cdf图
normspec([10 inf],mu,sigma)
probplot&qqplot
QQ(按分位数画图)
PP(按累积概率画图)

fanplot
probplot(x)
probplot(distribution,Y)

1.2 假设检验

均值检验

[h,sig,ci,stats]=ztest(x,mu,sigma,alpha)  %已知sigma未知mu。h=0,sig>0.05认为均值相等
[h,sig,ci,stats]= ttest(x,mu,0.05)   %单样本T检验。h=0,sig>0.05均值相等
ttest2(x,y)                    %独立样本T检验
ttest(x,y,alpha)             %配对样本T检验=ttest(x-y)

方差检验

vartest(x,var)     %单样本方差检验
vartest2(x,y)      %独立样本方差检验

方差分析

anova1              %实际上是三个以上的组的均值检验
[p,table,stats]=anova1(X)          %
[...]=anova1(X,group)           %group可以是矩阵或元胞

anova2              %双因素方差分析
anova2(data,rep)   %rep=1,每组1个数字,rep=2,每组2个数字

分布检验

h =jbtest(x)[h,p,jbstat,cv] =jbtest(x,alpha) % Jarque-Bera检验
h =kstest(x)            %Kolmogorov-Smirnov检验
h =lillietest(x)[h,p,lstat,cv]=lillietest(x,alpha)%Lilliefors检验

另外还有一种方法:首先对于数据进行标准化:Z = ZSCORE(X),然后在进行2)的Kolmogorov-Smirnov检验,检验是否为标准正态分布,类似于对于方法2)的改进

x=random('norm',0,1,200,1);
distname='norm';
pdca = fitdist(x,distname);
[h,p,ksstat,cv]  = kstest(x,'CDF',pdca);
%h=0接受原假设,认为服从'norm'分布

1.3 随机变量

分布的生成:

pdf('name',X,A,B,C)%概率密度函数
cdf'name',X,A,B,C%累积分布函数,
random('name',A,B,C,m,n)%随机生成数字
icdf('name',x,A,B,C)              %cdf的反函数
mle('name',X,alpha)              %参数估计 mle('bino',n,alpha,N)比较特殊
Mle:    
  phat = mle(‘name’,data) 分布函数名为dist的最大似然估计
  [phat,pci] = mle(‘name’,data) 置信度为95%的参数估计和置信区间
  [phat,pci] = mle(‘name’,data,alpha) 返回水平α的最大似然估计值和置信区间
  [phat,pci] = mle(‘name’,data,alpha,p1) 仅用于二项分布,pl为试验总次数

class方式生成:

pd = makedist(distname,Name,Value)
pd = fitdist(x,distname,'By',groupvar,Name,Value):已知数据求参数(点估计)
% mle:已知数据求参数(极大似然估计)

pd的方法:

方法 举例 备注
ProbDistUnivParam    
pdf    
cdf pd.cdf(1)  
icdf pd.icdf(0.5)  
iqr pd.iqr() IQR:3/4距差
mean     
median    
std/var    
random    
paramci ???  

随机种子:

rng(seed)%seed是种子,正整数
rng('shuffle')%种子与当前时间有关
rng(seed, generator)%generator时,迭代的算法
rng('default')%seed=0,generator='twister'时的情况

randperm(N)随机排列

1.4 排列组合

  1. 求n的阶乘
    factorial(n)
    gamma(n+1)
    v='n!'; vpa(v)
    
  2. 求组合(数)
    combntns(x,m)    %列举出从n个元素中取出m个元素的组合。其中,x是含有n个元素的向量。
    nchoosek(n,m)    %从n各元素中取m个元素的所有组合数。
    nchoosek(x,m)    %从向量x中取m个元素的组合
    
  3. 求排列(数)
    perms(x)         %给出向量x的所有排列。
    prod(n:m)        %求排列数:m*(m-1)*(m-2)*…*(n+1)*n
    prod(1:2:2n-1)    %求(2n-1)!!
    prod(2:2:2n)        %求(2n)!!
    prod(A)                %对矩阵A的各列求积
    prod(A,dim)         %dim=1(默认);dim=2,对矩阵A的各行求积(等价于(prod(A'))')
    
  4. 函数 cumprod() 累积求积函数:
    cumprod(n:m)        %输出一个向量[n n*(n+1) n(n+1)(n+2) … n(n+1)(n+2)…(m-1)m]
    cumprod(A)           % 若A为矩阵:输出同维数的矩阵,按列累积求积
    cumprod(A,dim)   % A为矩阵,dim=1或2,dim=1,默认,与上面一样;dim=2,按行累积求积。
    

列出排列组合:

randperm(6)  %随机全排列
b = perms([1 1 1 0 0 0]) $全排列
b=nchoosek([1 1 1 0 0 0],3) $全组合
b = perms([1 1 1 0 0 0]);     %列出[1 1 1 0 0 0]所有的排列,此时就是6的全排列等于720
b = unique(b,'rows');     %找出所有排列中的唯一值,共20个

1.5 多元线性回归

[b,bint,r,rint,stats]=regress(y,x,alpha)   (调整xx=[ones(size(x),x)])  
b:系数,bint:系数的置信区间  
r:残差,rint:残差的置信区间  
stats:用于检验显著性,包含:相关系数的平方R^2FF对应的p(p<alpha时,方程显著),残差的方差(前两个越大越好,后两个越小越好)  
rcoplot(r,rint) %画残差和置信区间,可以找出异常点  

1.5.1 多项式回归

[p,S]=polyfit(x,y,m)%m是次幂  p是系数,S是误差矩阵  
polytool(x,y,m,alpha)%画图  
Y=polyval(p,x) 求预测值  
[Y,delta]=polyconf(p,x,S,alpha),预测值和置信区间Y±delta  
多元二次回归  
rstool(x,y,'model',alpha)  
%linear:线性  
%purequadration纯二次  
%interaction纯交叉  
%quadratic以上的和  

1.5.2 非线性回归

[beta,r,J]=nlinfit(X,y,FUN,beta0)   %高斯牛顿法的非线性最小二乘拟合
     beta是拟合系数,r是残差,J是雅克比矩阵 FUN是匿名函数/m文件函数
  r' * r就是残差平方和
funtion y=fun(a,x)
ci=nlparci(beta,r,J,alpha)           %根据上一条的结果,得出置信区间
nlintool(X,y,FUN,alpha)           %!!!功能强大的画图工具!!!

函数  nlpredci                %y预测y值

格式  ypred = nlpredci(FUN,inputs,beta,r,J)   % ypred 为预测值,FUN与前面相同,beta为给出的适当参数,r为残差,J为Jacobian矩阵,inputs为非线性函数中的独立变量的矩阵值。

[ypred,delta] = nlpredci(FUN,inputs,beta,r,J)    %delta为非线性最小二乘法估计的置信区间长度的一半,当r长度超过beta的长度并且J的列满秩时,置信区间的计算是有效的。[ypred-delta,ypred+delta]为置信度为95%的不同步置信区间。

ypred = nlpredci(FUN,inputs,beta,r,J,alpha,'simopt','predopt')   %控制置信区间的类型,置信度为100(1-alpha)%。'simopt' = 'on' 或'off' (默认值)分别表示同步或不同步置信区间。'predopt'='curve' (默认值) 表示输入函数值的置信区间, 'predopt'='observation' 表示新响应值的置信区间。nlpredci可以用nlinfit函数的输出作为其输入。

!!!nlpredci   nlintool   spss线性回归,预测结果都不一样

1.5.3 逐步回归

逐步回归用来解决共线性问题

step(x,y,inmodel,alpha)
h = refcurve(p)   %画图:在图中加入一条多项式曲线

tool工具回归 plot后,tool→basic fitting

1.5.4 多重共线性问题

后果: 1、参数估计值β3的方差增大
r23是x2, x3的共线性系数
var(β3)=σ^2/Σx2^2/(1-r23^2)=…/(1-r23^2)
VIF(方差扩大因子) =1/(1-r23^2)

2、参数区间估计时,置信区间变大
3、对系数进行t检验时,由于方差变大,会使得t值变小,从而使得本应否定“系数为0”的原假设被错误的接受
4、R^2很高,F检验的显著性也很高,参数的t检验却不通过。

总结:参数估计值方差增大,置信区间增大。方程通过检验,系数不通过检验。

检验:VIF法,接近1说明共线性很弱,超过10说明共线性严重

补救:

  1. 剔除变量法(简单粗暴)
  2. 增加样本容量(很多时候,多重共线性是因为样本量太小)
  3. 变换模型形式(用一阶差分回归,diff)
  4. 逐步回归法:
    step1:对每一个解释变量和被解释变量做回归,以贡献最大为基础
    step2:逐个引入新变量,
    if 引入后改进了R^2和F检验,且其它解释变量的t检验显著,保留该变量
    elseif 引入后不改进R^2和F检验,且其它解释变量的t检验显著,认为是多余的
    elseif 引入后不改进R^2和F检验,且其它解释变量的t检验变得不显著,认为有严重的多重共线性

以下补救直接改变了OLS:

  1. 岭回归法(是一种有偏估计)
  2. 主成分法
  3. 偏最小二乘法

1.5.5 异方差

定义:误差项的方差是变化的(与解释变量有关) 后果: 。。。

1.5.6 自相关

定义:误差项之间纯在相关关系 原因: 1、经济系统的惯性 2、经济活动的滞后效应 3、数据处理造成的相关(插值、平滑化等) 4、蛛网现象 5、模型偏差(省略了某个重要变量)

1.6 PCA

主成份分析
[COEFF,latent,explained] = pcacov(V)
where,
V是协方差矩阵 p-by-p
COEFF是主成份变换矩阵
latent是特征值
explained贡献率

[COEFF,SCORE,latent,tsquare] = princomp(X)
where,
X是原始数据
SCORE是每个样本每个主成份的得分
tsquare是每个数据点的HotellingT2统计量

clear
clc
X=[
76.5	81.5	76.0	75.8	71.7
70.6	73.0	67.6	68.1	78.5
90.7	87.3	91.0	81.5	80.0
77.5	73.6	70.9	69.8	74.8
85.6	68.5	70.0	62.2	76.5
85.0	79.2	80.3	84.4	76.5
94.0	94.0	87.5	89.5	92.0
84.6	66.9	68.8	64.8	66.4
57.7	60.4	57.4	60.8	65.0
70.0	69.2	71.7	64.9	68.9
];
%%
%pcacov

num_variables=size(X,2);
V=cov(X);
[COEFF,latent,explained] =pcacov(V);%核心代码!!!
%COEFF转换矩阵,latent特征值,explained累积

%%
%可视化展示
row_names=cell(num_variables+1,1);
column_names=cell(1,num_variables);
for i=2:num_variables+1
row_names{i}=['X',num2str(i)];

end
for i=1:num_variables
column_names{i}=['PRIN',num2str(i)];
end
disp('---------------协方差矩阵--------------')
disp(V)
disp('---------------特征值------------------')
fprintf('特征值    累积\n')
disp([latent,explained])
disp('-----------------特征向量------------------')
disp([row_names,[column_names;mat2cell(COEFF,ones(1,5),ones(1,5))]])



%%
%直接输入原始数据
[COEFF,SCORE,latent,tsquare] = princomp(X)



%%
%注意:
%得出的COEFF和SCORE可能对应的行/列同时加上一个负号,也对
%X=X+100得出的结论也完全相同
%X=X/100得出的COEFF也相同
%计算SCORE时,每一项要减去均值,例如:
%[X(:,1)-mean(X(:,1)),X(:,2)-mean(X(:,2)),X(:,3)-mean(X(:,3)),X(:,4)-mean(X(:,4)),X(:,5)-mean(X(:,5))]*COEFF
%上式与SCORE完全相同

1.7 FA

[lambda,psi,T,stats,F] = factoran(X,m)
X:n*d,样本容量nd
m:返回m个公共因子
lambdad*m (i,j)个元素为第j个因子在第i个变量上的载荷(或系数)
psi:特定方差的最大似然估计
T:包含以下字段:(H0:公共因子个数为m
loglike    最大对数似然函数
dfe       误差自由度((d-m)^2-(d+m))/2
chisq    H0的近似卡方统计量
p           H0的右侧显著性水平  p小说明m太少

[lambda,psi,T]=factoran(X,2,'xtype','covariance','delta',0,'rotate','none')

书推荐

  1. 【强烈推荐】matlab与数学试验 国防工业出版社 全面介绍了matlab的各种应用,值得注意的是:数值积分试验,微分方程试验,随机模拟实验,加密方法试验,分形模拟试验,遗传算法试验
  2. 傅里叶变换及其应用 布雷斯威尔 西安交通大学出版社 好书!包含拉普拉斯变换,扩散方程,成像技术等,值得看!!
  3. 数理统计及其在数学建模中的实践(done)
  4. matlab入门到精通:符号计算,电路模拟,simulink
  5. 精通matlab,计算篇(插值,傅立叶分析,偏微分方程),计算实例
  6. 数理统计与数据分析
  7. matlab实用指南(上下)电子工业出版社 书比较薄,比较深

您的支持将鼓励我继续创作!