数据步和过程步,每步都要加run,过程步可以合在一起run。
1.建立临时数据集,存放在work临时库中
data temp;(data后面加上你要建立的数据集名)
2.建立永久数据集
libname study’x:\xxx\xx’ ; (数据库名’数据库的绝对路径’)
data study.xxx;(xxx表示数据集名)
3.数据导入
input a b c$ x1-x3 @/@@;(@与数据一行一行对应,@@可以一行匹配全部)
cards;
xxxxxxxx
;
run;
proc import out=xxx(数据集名,且这里不加分号)
datafile=“xxxx.xls”;(excel表的绝对路径)
dbms=excel2000 replace;
run;
data xxx;(或者libname)
infile ‘xxxxx’(指明数据文件的绝对路径如D:\test\test.txt)
input a b c$ x1-x3;(数据集中的每个数据对应的名称和数据类型)
run;
4.数据编辑和导出
对于空数据集,建立后
set xxx;(某个已经存在的数据集)
keep xx xx;(保留数据集中的变量,不用带$符号)
(或者drop xx xx删除数据集中的某些变量)
run;
但是set是串接,对于已经写好的数据集可能数据导入效果不好
这个时候要用到并接,merge;不管是set还是keep都可以串起多个数据集
如建立空数据集temp1,set temp2 temp3串接的数据存入,这需要temp2和temp3是同一数据类型而merge temp2 temp3并接的数据存在,temp2和temp3不是统一数据类型
选用某个数据集中的变量如sex,男则导出stf数据集,女则导出stm数据集
data stf stm;(可以同时建立多个临时数据集)
set xxx;(待处理的数据集)
select (sex);(选择待处理的数据集中的变量)
when (“男”) output stf;(output就是把xxx数据集中男生的数据导出到stf数据集中)
when (“女”) output stm;
otherwise put sex=“错误”;(防止数据导入出现问题)
end;(这里要加end)
run;
proc print data=stf; (过程步常见的打印语句)
proc print data=stm;
对原数据的内容进行加工该怎么办?
常见的写法是,建立一个空数据集,set使用待处理的数据集,如:
data temp2;
set temp1;
sum=test1+test2+test3;/这里是定义变量来求和和求平均值以及指数值/
averge=sum/3;
y=x3;**
test=sum(x1,x2,x3)或sum(of x1 x2 x3)或sum(of x1-x3)/这里是sum函数的用法/
run;
当然你也可以直接再input和cards之间之间对变量进行编辑,如:
data bodyfat;
input sex $ fatpct @@;
fat=fatpct/100;
cards;
tips:recall可以找回刚刚的代码,lib可以打开数据集库
1.means过程
样本均值,中位数,四分位数,样本方差,极差,变异系数,
偏度,峰度,标准,二阶、三阶和四阶中心距差统计量表示:
proc means noprint data=temp mean median qrange var range cv skewness kurtosis std;
var xx;
run;
其中k阶中心矩需要进行额外的操作:
B2=Σ(Xi-X拔)²/n,B3=,B4=;
可以把上述的结果输出到一个数据集temp1中,然后建立一个新表temp2导入原始数据,用merge把mean和数据并接,你也可以直接在temp2中求和/n得到均值,最后指数利用**符号,最后用drop再和means过程的表并接,得到数据统计结果。
2.univariate过程
基本数据统计量矩,位置和变异性的基本测度,位置检验,正太性检验(normal),分位数,极值的观测
图:茎叶图,箱线图,正太概率图(plot)
proc univariate data=temp plot normal;
var xxx;
run;
当样本量小于2000时,看正太性检验的Shapiro-Wilk检验量,否则看Kolmogorov-Smirnov统计量当P值>0.05时,则接受H0,拒绝H1,认为变量符合正态分布,否则则不服从。
显著性水平a=0.01和0.05,前者是极显著,后者是显著的划分,且显著水平就是p值
如果P<0.05,说明某件事情的发生至少有95%的把握,统计语言描述为在0.05水平上显著。
如果P<0.01,说明某件事情的发生至少有99%的把握,统计语言描述为在0.001水平上显著。
根据h0h1是属于完全事件原理的对应部分,然后再得出实验结论。
**
**
proc reg data=test1;
model y=x/cli;(cli得预测值的置信度为95%置信区间,在原数据中加入(x,.)可得推断值和对应的置信区间)
run;
/制作Y对X的散点图/
proc gplot data=test1;
plot y*x;
symbol value=dot;
run;
/作变量变换化非线性回归为线性,再用REG过程建立回归方程/
data test2;
set test1;
x=1/x; (双曲线 )
y=1/y; (x=x(1/2);y=y;幂函数)(x=log(x);y=y;对数函数)(x=1/x;y=log(y);负指数函数)
run;
proc reg data=test2;
model y=x;
plot y*x;
run;
Parameter Estimates表可以得斜率和截距,由此得回归方程,也可以从散点图看到
回归方程的显著性检验:由Analysis of Variance表可知,F Value=140.99,Pr>F 的值(Probability概率)小于0.0001,远小于0.05,故拒绝原假设,接受备择假设,认为y与x之间具有显著的线性相关关系;
由R-Square的值为0.9592可知该方程的拟合度很高,样本观察值有95.92%的信息可以用回归方程进行解释,故拟合效果较好,认为y与x之间具有显著的线性相关关系.
最佳的拟合曲线也是看R-square的值,值大,拟合程度好
散点图若不是线性,或是呈曲线非线性的样子,则需要进行变量变换化为线性
利用predict_y=intercept+x*x。 可以用这个语句对原数据集进行数据预测,类似(x。, .)这样的处理
**
**
对于y和x1,x2,x3进行多元回归:
变量交叉项:Xi4=Xi1Xi2; Xi5=Xi1Xi3; Xi6=Xi2*Xi3;
proc reg data=temp2;
var Xi1-Xi6;
model Yi=Xi1-Xi3/cli clb r ss2;
plot r.*p. r.*Xi1 r.*Xi2 r.*Xi3 r.*Xi4 r.*Xi5 r.*Xi6 npp.*r.;
run;
解释:cli求预测值的置信度为95%的置信区间,clb求回归系数的
r是作残差分析,能得到刀切残差,学生氏残差,残差显著图,Cook’S D统计量。
SS2是用该类模型计算在约束条件下损失的回归平方和
残差向量为Residual这一列;残差关于预测值^Y和xi以及变量交叉项的残差图:
plot r.*p. r.*Xi1 r.*Xi2 r.*Xi3 r.*Xi4 r.*Xi5 r.Xi6
npp.r.是画残差的正太概率图,若残差基本分布在一条直线上,可以基本认为残差服从正态分布。
proc reg data=temp1;
model Yi=Xi1-Xi3/ss2;
restrict Xi1=Xi2;
run; 从图中看出当显著性水平a=0.01时,P值<0.0001<0.01,说明回归分程具有显著的线性相关性,即满足了约束条件Xi1=Xi2下,
RESTRICT对应的SS2说明增加了这个约束条件损失了回归平方和15.60337,但换来了模型的简化,这个数值越小,说明这个约束条件越客观存在。(也可以用test Xi1=Xi2)
proc reg data=temp1;
/R-Squre,MSE,CP法选择最优方程/
model Yi=Xi1-Xi3/selection=rsquare mse cp;
run;
/PRESS法选择最优方程/
proc reg data=t;
model z=Xi1/noprint;
output out=temp2 press=press;
run;
proc means uss data=temp2;
var press;
run; (需要你依次对所有变量和变量交叉项进行重复操作)
PRESS(预测平方和准则),可以向上述代码中这样写,也可以对所有变量的组合直接进行proc reg过程并带上统计关键词r,得到的第二张表里面有Predicted Residual SS(PRESS),
然后把每个值都进行比较,取值最小的那个。所以根据该准则,USS=1.5990749最小只保留Xi1和Xi3。
上述准则中,R²值越大越好,CP和MSE和PRESS越小越好
/逐步回归法选择最优方程/
proc reg data=temp1;
model Yi=Xi1-Xi3/selection=stepwise;
run;
**
**
/主成分分析主要步骤/
proc princomp data=temp2 prefix=S out=temp3 outstat=temp4;/std (type=cov/corr)/
var X1-X4;
run;
proc plot data=temp3;
/画主成分之间的散点图/
plot S2S1 $ n=""/
href=-1 href=2 vref=0;
/按S1的得分值从小到大排序/
proc sort data=temp3;
by S1;
/计算矩阵的特征值和正交特征向量:/
proc iml;
a={15 -6 0,-6 18 -6,0 -6 21};
call eigen(values, vectors, A);
print a values vectors ;
run;
/计算从协方差矩阵的数据来主成分分析的格式,也可以换成corr;/
data t(type=cov);
input name$ x1-x3;type=‘cov’;
cards;
x1 15 -6 0
x2 -6 18 -6
x3 0 -6 21
;
run;
proc princomp data=t (type=cov) covariance;
var x1-x3;
run;
分析:out得到原始数据和主成分得分数据,outstat得到统计量的数据集
prefix指定主成分的前缀,缺少时默认为print1,print2……
主成分的散点图可以找极化的情况,最上、下、左、右然后进行实际分析
相关阵和特征值和特征向量以及贡献率和累计贡献率在Eigenvalue和Eigenvectors中得到
若某个特征值为0可以判断这组变量存在近似的线性关系
主成分表达式为:特征向量X,(行列1xpp1)
观察主成分的载荷的正负性和所占比例,可以对该主成分进行解释从而合并信息归为某种因子最后进行归类,从散点图看到分界点,从而再由某个主成分的out排序表进行分类,进而用此来进行主成分聚类分析。
特征值和特征向量的计算可以采用proc iml过程和proc princomp过程,后者需要指定数据类型
**
**
proc factor data=temp1 method=principal priors=one simple corr score proportion=0.80;
var pop school employ services house;
run;
method为principal是用主成分法进行因子分析
priors=one规定计算先验公因子方差估计的方法,两者都是程序默认的参数
corr求相关阵和偏相关阵,simple输出简单条件量
score用回归法估计因子得分模型系数
proportion为选取公因子个数m,使m为满足λ1+…+λm / p ≥ 0.80的最小正整数
所求出的公因子解,初始因子载荷阵并不满足“简单结构准则”,即各个公共因子的典型代表变量不很突出,因而容易使公共因子的意义含糊不清,不利于对因子进行解释.为此必须对因子载荷阵施行旋转变换,使得各因子载荷的平方按列向0和1两极转化,达到其结构简化的目的.这种变换因子载荷阵的方法称为因子旋转,而旋转变换的方法主要有正交旋转,斜交旋转等.
proc factor data=d832 rotate=varimax n=3;
/ROTATE=VARIMAX(或R=V)表示对因子载荷阵进行方差最大正交旋转,选项N=3指定公因子个数m=3./
var x1-x8;
run;
正交旋转后,每个因子只有少数几个指标的因子载荷较大,所有可以对指标进行分类
/用回归法求因子得分函数,计算样品的因子得分,并绘制第一和第二因子得分的散布图/
proc factor data=d832 rotate=v score n=3 out=o852;
var x1-x8;
run;
proc print data=o852;
var factor1 factor2 factor3;
run;
proc plot data=o852;
plot factor2factor1 $ n=′′/
href=0 vref=0;
run;
因子载荷矩阵和因子模型表达式,因子得分表达式,旋转后的因子模型,hi²和qi²,载荷极化后的分析载荷平均无法进行解释,需要进行因子旋转得到极化载荷再进行专业解释
**
**
proc discrim data=temp1 wcov simple pool=no manova method=normal crosslisterr listerr;
/proc discrim data=temp1 pool=yes manova method=normal crosslisterr listerr;/
class group;
var x1-x2;/var x1 x3;var x1-x4;/
priors equal;/priors ‘0’=0.05 ‘1’=0.95;/
run;
总体和每个类的均值向量可以由simple得到
wcov得到组内协方差,也就是样本协方差
pcov得到合并协方差,这两种协方差的对应的使用条件与pool关联
pool为yes的时候采用合并协方差矩阵,意味着对应的总体协方差矩阵不相同
为no的时候采用组内协方差矩阵,意味着对应的总体均服从协方差矩阵相等的正态总体
为test的时候对组内协方差矩阵进行齐性的似然比检验修正,和slpool用来指定齐性检验水平,默认0.1
method为normal表示类服从多元正态分布,为npar即不服从该分布采用非参数方法
crosslisterr以交叉表的形式输出回判结果,用的是刀切法
listerr由后验概率产生的回判错误信息,要求按距离准则得到判别结果
priors为equal表示先验概率相等,为proportional表示先验概率等于样本频率,也可以指定分类标志的先验概率,但总和为1
比较判别准则的好坏,看误判结果的Total选项,一般来说谁更小则谁的准则更好
小样本的情况下一般使用联合协方差矩阵来进行判别是更为优先的选择,样本小,特异性大,联合协方差矩阵更能均衡数据
manova得到4个统计量,Wilks’lambda用来衡量组内平方和与总平方和之比,Wilks’lambda值大,表示各个组的均值基本相等,
在判别分析中,只有组均值不等时,判别分析才有意义
**
**
样品数量1~100的时候使用系统聚类proc cluster
proc cluster data=temp1 method=single std pseudo;/single方法不适合用ccc,有误差/
/proc cluster data=temp1 method=ward std pseudo ccc outtree=temp2;/
/var x1-x6/
/id group/
proc tree hor graphics;
run;
这里的single是使用最短距离法,常用的还有complete(最长距离发法)、eml(最大似然法)、centroid(重心法)等11种聚类方法
std是对数据进行标准化,proc tree是打印谱系图,hor是让图水平横置
pseudo是得到PSF和PSFT2即伪F和伪t²统计量来判断分几类
样品数量100~100000的时候使用动态聚类proc fastclus
proc fastclus data=temp1 maxc=4 list out=temp2;
var x1-x8;
id area;
proc candisc data=temp2 out=temp3;
var x1-x8;
class cluster;
run;
对变量进行聚类分析时候使用变量聚类proc varclus
proc varclus data=temp1 trace outtree=test; /centroid minc=4/
var x1-x8;
proc tree data=test horizontal;
run;
默认是主成分法,加上centroid是从重心成分法进行分析
可设置最大最小聚类数minc maxc;trace列出迭代的类
还可以利用proc transpose 进行行列转换来对变量系统聚类:
proc transpose data=temp1 out=temp2;
var x1-x8;
proc print data=temp2;
proc cluster data=temp2 method=single std pseudo;
var COL1-COL31;
id NAME;
proc tree hor graphics;
run;
分类分析:由R²值来看,某个类骤降的时候,则是分为几个类的标准
伪F值是出现峰值的时候,分类以这个峰值所在类为标准
聚类分析有R型对变量或是指标进行聚类,Q型对样品进行聚类。而分别两者的统计量一个是相似系数,一个是距离。
对于变量聚类的varclus方法,在结果中能直接得到分类结果,也可以自行分析。