DATA example7_9;
INPUT height weight cir xin;
CARDS;
95 	14	54	50
92 	13	52	42
89 	13	53	36
158	52	79	99
119	20	55	68
113	18	53	61
125	22	59	67
91 	14	48	36
93 	13	50	44
92 	11	53	32
154	55	80	95
163	54	82	87
130	25	59	63
98 	17	51	51
99 	15	51	54
;
ODS LISTING CLOSE;
/*该语句限制"PROC PLS"和"PROC CORR"运行结果的输出，与后面的"ODS LISTING;"语句相呼应。本程序主要是计算并输出VIP，因此采用该语句限制过程中结果的输出。如果想了解VIP计算的具体过程，可以不用此语句，以便显示过程中的计算结果*/
ODS OUTPUT xweights=w;
/*该语句是针对"PROC PLS"命令，将结果中因子在自变量上的权重输出到数据集W*/
PROC PLS nfac=1 details;
/* NFAC=1选项表示只选择一个因子（前面我们已经确定了仅选择一个因子），DETAILS选项表示给出详细的结果，包括因子在每个变量上的权重*/
MODEL xin=height weight cir/solution;
OUTPUT out=out1 xscore=xscore;
/*该语句建立一数据集OUT1，数据集中包含原变量及选取的主成分*/
RUN;
ODS OUTPUT pearsoncorr=pcorr;
PROC CORR;
VAR xin xscore1;
RUN;
/*上面语句是对因变量与主成分进行相关分析，并将相关系数输出到数据集PCORR*/
ODS LISTING;
/*该语句与"ODS LISTING CLOSE;"相对应，表明这两句之间的结果不输出*/
DATA corr(keep=xin xin1 xin2);
SET pcorr;
IF variable='xin' then delete; 
xin1=xin;
xin2=xin;
RUN;
/*上一段语句建立一数据集，名为"CORR"，该数据集将其它变量删除，仅保留因变量与主成分的相关系数XIN，为了跟三个自变量权重一一对应计算，故产生XIN1和XIN2两个变量，与XIN值相同*/
PROC TRANSPOSE data=w(drop=numberoffactors innerregcoef) out=weight prefix=w;
RUN;
/*该语句将数据集W行列转置，输出到数据集WEIGHT，该数据集含三个自变量权重*/
PROC TRANSPOSE data=corr out=correl prefix=c;
RUN;
/*该语句将数据集CORR行列转置，输出到数据集CORREL，该数据集含三个相关系数*/
DATA vip;
MERGE correl weight;
vip=sqrt(3*(c1**2*w1**2)/(c1**2));
RUN;
PROC PRINT;
RUN;
/*上一段语句将数据集WEIGHT和CORREL合并，并根据权重和相关系数计算VIP*/
