SASchapter3

1.SAS函数的定义
###表达式中使用函数
data a(keep=date y d min);
set resdat.idx000001;
y=year(date);/*函数year给出变量date的年份*/
d=weekday(date);/*函数weekday给出变量date在一周内的哪一天*/
min=min(sum(oppr,hipr,lopr,clpr),1000);
run;
###条件语句中使用函数
data a;
set resdat.idx000001;
where year(date)>1996;
run;
###用与不用SAS函数时的程序:
totx=xl+x2+x3+x4+x5+x6+x7+x8+x9+x10;
if totx<y then least=totx;
else least=y;
least=min(sum(of x1-x10),y);

2.自变量名缩写方法
sum(of x1-x10)
sum(x,y,z)
sum(of x1-x10 d y1-y100)
###数组元素自变量的缩写法
array y{10} y1-y10;
x=sum(of y{*}); Annotation: * 是显示下标数组的特殊标识符号
z=sum(of y1-y10);
3.函数的结果
函数的结果由其自变量的属性决定。
即自变量为字符,结果亦字符;
自变量为数值,结果亦数值
PUT函数是例外,无论自变量如何,其结果总为字符。
###显示函数值的方法(用PUT在LOG窗口显示)
data;
y=probnorm (1.96);/*标准正态分布小于1.96的概率*/
put y;
q1=tinv(0.95,2);/*自由度为2的T分布的0.95分位数*/
q2=tinv(0.95,2,3);/*自由度为2、非中心参数为3的0.95分位数*/
put q1= q2=;
run;
4.日期函数(SAS日期和时间存储标准是以1960年1月1日0时0分0秒为起点,然后以相应的间隔记时。)
###返回两个日期之间的天数(datdif)
data _null_;
sdate='01jan2002'd;
edate='01jan2002'd;
actual=datdif(sdate,edate,'act/act'); /*按每个月实际天数计算*/
days360=datdif(sdate,edate,'30/360'); /*按每个月30天计算*/
put actual= days360=;
run;
###当前日期date()today()
data;
x=date();
y=today();
put x= y=;
run;
#限定输出格式
data;
x=date();
y=today();
format x y yymmdd10.;
put x= y=;
run;
###计算日期所处的年日月及所处的月的第几天
data a;
set resdat.stk000001(obs=10);
keep date year qtr month day;
year=year(date);
qtr=qtr(date);
month=month(date);
day=day(date);
proc print noobs;
run;
###将日期时间值换算为以秒计数的计算方法.mdy()、hms()、dhms()
data;
mdy=mdy(11,30,2016);
put mdy=;
format mdy yymmdd10.;
hms=(23,26,52);
x=23*60*60+26*60+52;
put x=;
dhms=dhms(date(),23,26,52);
put dhms=;
dhms=dhms (15263,21,50,51);
put dhms=;
y=15263*24*3600+x; put y=;
run;
###计算量日期之间的年数.yrdif()
data _null_;
sdate='18may1996'd;
edate='30oct2016'd;
y30360=yrdif(sdate,edate,'30/360');
yactact=yrdif(sdate,edate,'act/act');
yact360=yrdif(sdate,edate,'act/360');
yact365=yrdif(sdate,edate,'act/365');
put y30360= yactact= yact360= yact365=;
run;
###以秒为单位计算当前日期
data;
n=datetime();
put n=;
format n datetime20.4;


y=datetime();
put y=;
format y datetime20.;

z=datetime();
put z=;
frmat z hhmm8.2;
###计算当前时间的小时数和分钟数。
x=hour(datetime());
put h=;
y=minute(datetime());
put y=;
#################################################################################
5.假设你有100万元RMB存款,在2005年6月1日存入中国银行( Bank of China),你当时存入的1
年期利率为4.14%,如果每年到期后不取,银行系统自动转存。在2008年9月1日,你突然急需用
钱,需要全部取出所有存款(本金+利息),请问你可以在中国银行取出多少RMB? ( PS:中国银
行活期利率是0.72%,利息所得税为5%)
###关于利息所得税,以年为计的定期的在每年扣除税费后再滚入下一年。时间以30/360为计。
data;
x=1000000;
sdate='01jun2006'd;
edate='01sep2008'd;
m1=1000000*0.0414*0.95;
m2=(1000000+m1)*0.0414*0.95;
m3=(1000000+m2)*0.0414*0.95;
t=yrdif(sdate,edate,'30/360');
t1=t-int(t);
t2=int(t1*360);
m4=(1000000+m3)*0.0072*0.95*t2;
money=1000000+m3+m4;
put money=;
run;

#################################################################################
6.SAS概率分布函数
###probnorm()计算标准正态分布随机变量小于X的概率。
#三个常用正态概率值
data;
p1=probnorm(0);
p2=probnorm(1.96);
p3=probnom(2.5758293);
put p1= p2= p3=;
run;
###probt(x,df,nc)计算自由度为df1、非中心参数为nc的t分布随机变量小于X的概率,nc缺省时默认为0、即中心t分布。
#双边t检验显著水平的计算公式 (1-probt(abs(x),df))*2
eg.计算T分布双侧尾部概率
dat1a;
p=(1-probt(abs(6),6)*2;
put p=;
run;


7.分位数函数(Inverse[逆] Cumulative Distribution Function INV)。
###标准正态分布的分位数函数probit(),即probnorm()的反函数。
data;
p=probnorm(probit(0.025));
put p=;
run;
#Chi-square分布分位数
cinv(p,df,nc) /*0<=p<=1、df>0、nc>=0*/
#beta分布分位数
betainv(p,a,b);/**0<=p<=1、a,b大于0*/
#F分布分位数
finv(p,ndf,ddf,nc);


8.样本统计函数。
#均值mean(of x1-xn)
#最大值max(of x1-xn) 或者max(x,y,....)
#最小值min(of x1-xn) 或者min(x,y,....)
#非缺失数据的个数N(of x1-xn) 或者N(x,y,...)
#缺失数据的个数 NMISS(of x1-xn)
#sum(of x1-xn)
var(of x1-xn)
std(of x1-xn)#标准差
stderr(of x1-xn)#标准误
cv(of x1-xn)#变异系数
range(of x1-xn)#极差
css(of x1-xn)#校正平方和
uss(of x1-xn)#未校正平方和
skewness(of x1-xn)#计算自变量偏斜度
kurtosis(of x1-xn)#峰度


9.随机数函数
###用rannor产生正态分布随机数是SAS随机模拟的基础
data rv;
retain _seed_ 0;/*retain赋初值0给_seed_*/
mu=0;
sigma=1;
do _i_=1 to 1000;
normall=mu+sigma*rannor(_seed_);/*均值为MU,标准差为SIGMA*/
output;
end;
drop _seed_ _i_ mu sigma;
run;
###用ranuni()产生均匀分布随机数
data rv1;
retain _seed_ 0;
a=-1
b=2;
do _i_=1 to 1000;
uniform1=a+(b-a)*ranuni(_seed_); /*区间[a,b]上的均匀分布*/
output;
end;
drop _seed_ _i_;
run;

###用uniform()产生均匀分布随机数
data rv1;
retain _seed_ 0;
a=-1
b=2;
do _i_=1 to 1000;
uniform1=a+(b-a)*unifrom(_seed_); /*区间[a,b]上的均匀分布*/
output;
end;
drop _seed_ _i_;
run;

/**/

 

posted on 2016-12-01 13:48  徐艺君  阅读(294)  评论(0)    收藏  举报

导航