分类目录归档:SAS应用

Data步双output、双set的妙用

前两天在一个SAS QQ群上碰到一个处理数据实际问题,觉得挺有意思的,分享给大家。

问题:“sxlion:   你好!

我的问题是要把ML.ped文件里面的全部按照文件ML.bim改为1和2. 修改的标准为:
 ML.ped的列数为ML.bim的2倍.
如果ML.ped的2n-1或2n列等于ML.bim表的第n列的第一个字母,那么ML.ped的2n-1或2n列就为1,否则为2.
 modi.txt是我修改的部分数据,通过这样的程序来实现:
 data ML1;
  set ML;
array geno{86} _all_;
  if geno{1}=”A” then var7=1 ; else  var7=2;
if geno{2}=”A” then var8=1 ; else  var8=2;
  if geno{3}=”T” then var9=1 ; else  var9=2;
if geno{4}=”T” then var10=1 ; else  var10=2;
.
.
.
run;
冬末”
三个数据附件:ML.ped   ML.bim modi.txt (点击数据下载地址 均可用记事本打开)。
思路:看了冬末给的代码,能了解个大概的意思,可能需要宏把“if … then … else …”用宏代替,不过还得看懂数据,了解实际需求。我把数据ml.ped打开一看,发现里面是字段是A,G,T,C,哈哈,这不是DNA的碱基么,嘌呤,嘧啶什么的,挺有意思的,估计是与基因排列规律的有关数据,然后继续查看ml.bim,里面也是些AGTC字母,应该是参考碱基序列。最后看看目标数据modi.txt,只有部分修改好的。拿到数据的第一反应是,数据查询,用select into 建立宏变量列表解决这个问题,后来发现有个列数倍数的问题,实现起来需要嵌套宏,难度加大比较麻烦,放弃;还想到hash大杀器。。。
对于SAS来说,如果一个简单的问题(因为数据量太小了),动用太高级的武器是不值得的。后来想想双set不是能很好的解决这个问题么? 只是在构造循环的时候需要考虑2倍的问题。 如果问题能进一步简化,不是更好吗 ?  把一个观察值重复两遍的比较,如果构建一个重复不就可以了,于是双output就用上了。于是敲了几行代码,解决了。
解决代码:

data mlped;
input var1 :$5. var2 :$5. (var3-var92) (~$1.) ;
cards;

H1000 H1000 0 0 1 2 A G T C T C G A T C C T T A C T T C T C G A A G T C C T C G A C T C C A A … G
H1003 H1003 0 0 1 2 A G T T T C G G 0 0 0 0 0 0 0 0 C C T T 0 0 G G 0 0 C C G G A A T T C C T…  C
…/*将ML.ped数据复制过来*/

H1004 H1004 0 0 1 2 A G T C T C G A T C C T T A C T T C T C G A A G T C C T C G A C T C C A  C … C G

;
run;

data mlbim;
input a $4.@@; output; output;  /*双output构建新的查询数据*/
if _N_ = 43 then stop;
cards;
A T T G T C T C T T G A T C C A T C A A A G G G G T C C T A G C C C G C C G A T G T C
G C C A C T A T C C A G C T G C C A T G G A A A A C T T C G A T G G A T T A G C A G G
;
run;

data modi;
set mlped;
array geno[86] var7-var92;
array newgeno[86] nvar7-nvar92;
do i= 1 to 86 ;
set mlbim point=i;    /*双set ,使用point定位查询数据集ml.bim */
if geno[i]=a then newgeno[i]=1 ;else newgeno[i]=2;
end;
output;
run;

proc print data=modi;
var nvar7-nvar92;
run;

运行结果:

NOTE: 从数据集 WORK.MLPED. 读取了 2020 个观测
NOTE: 数据集 WORK.MODI 有 2020 个观测和 179 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.04 秒
CPU 时间 0.03 秒

运行结果非常快,结果与给的参考结果modi.txt一致,Bingo!

线性规划之合金原料配比问题

前言:虽然这是个比较简单的线性规划问题,但是怎么把问题转化为SAS代码,中间需要一定的小技巧,特叙此例。

问题:

Metalco公司希望得到一种新的合金,其中锡40%、锌35%、铅25%。原料合金的成分如下表:

合金

原料代号

成    分

价格

锡含量 / %

锌含量 / %

铅含量 / %

美元/磅

1

60

10

30

77

2

25

15

60

70

3

45

45

10

88

4

20

50

30

84

5

50

40

10

94

工厂怎样从这几种合金原料选择来制得需要的合金,要求生产成本最小。
分析:
显然,这是个线性规划问题。
首先分析下目标,目标是生产成本最小,也就是生产单位重量(磅)的新合金用到的原料合金总价格最低。 Continue reading 线性规划之合金原料配比问题

Some discriminat methodes and SAS codes

NOTICE: The following text is one part of my published paper. Do not distribute it! All right reserved.

介绍线性判别方法、针对强共线性数据的两种降维判别方法及SAS实现代码。

1, linear discriminant analysis (LDA)
Because of its simplicity and robustness, LDA has been one of the most frequently used classification techniques since 1936.
LDA:
proc discrim data=ex1 testdata=ex2;
class g;
var x1-x10
run;

2, Combation of PCA and LDA(PCA+LDA), or PLS and PCA (PLS+LDA)
Principal component analysis (PCA) is the fundamental method used in chemometric and is based on vector algebra. The main purpose of this method is to reduce the dimensions of a data set with a large number of intercorrelated variables, whilst retaining as much of the information present in the original data as possible. A new set of orthogonal variables, principal components (PCs), describe the variance in data. Only first few of them can retain most of variation in describing the systematic information of all the original variables. Usually, a subset of limited PCs is used to explore the trends of samples with different treatments. Furthermore, when using these PCs as input variables, linear discriminant analysis (LDA) can greatly reduce multiple co-linearity among the variables of the original data. Therefore, the combination of PCA and LDA (PCA+LDA) was used here for the goal of classification. Principal component regression (PCR) is a multiple linear regression method for relating two sets of variables (PCs and response variables) with predictive purposes. PLS is an extension of PCR, which is applied to relate two sets of variables by a regression model. But in PLS, the principal components are more correlated with the response variables. This results in a more effective prediction of the response variable. In the same way, the PCs of PLS can be used in conjunction with LDA (PLS+LDA) to tackle classification problems. Continue reading Some discriminat methodes and SAS codes

用SAS模拟随机数据 求pie值

刚刚看到一本好书《统计模拟》作者叫罗斯[英文:Sheldon M. Ross. Simulation(4th Ed).Elsevier Inc..2006 ]. 顾名思义,这是一本描述怎么利用模拟一些符合统计学理论的数据,用途很广,也就是说实际中的任何数据的分布都符合某种统计学模型,于是在没有得到真实数据之前,我们可以通过模拟数据来研究这些现实中的问题。 Continue reading 用SAS模拟随机数据 求pie值

都是小数点惹的祸

今天mymas上有人用了两种方法通过分组求平均数问题,发现结果不一样。为了说明问题,我自己简单地造了些数据,如下:

data dup;
input  id  date  field  value ;
cards;
1  2  0.0001  10
1  2  0.0001  10
1  2  0.00001  10
1  2  0.00001000001  10
1  3  0.00001  10
1  3  0.00001  10
1  3  0.00003  10
1  3  0.00003  10
1  3  0.00003  10
;
run;
proc sql;

create table NoDup1 as
select unique id, date, field, avg(value) as value from Dup group by id, date, field;
quit;   ;
*method 2;
proc means data = Dup nway ;
class  id date field;
var value;
output out = NoDup2(drop = _type_ _freq_) mean = value;
run;
初一看来,好像代码没什么问题,应该结果一致,然而结果运行后,用sql得到的结果与proc步不一样,这是为什么? 似乎这是SAS的错误,哈哈这个多么伟大的一个发现啊!  SAS可以说是总多行业里面的标准,竟然也会错。   其实这不是第一次发现这类问题。 以前也遇到过同样的一个问题,就是: Continue reading 都是小数点惹的祸