当前位置: 首页 > 其他范文 > 其他范文

SAS快速入门

作者:1073 | 发布时间:2023-06-06 10:30:00 收藏本文 下载本文

SAS快速入门

我们预防医学的根本任务是提高居民健康,高质量地生活。通常我们首先要弄清二个问题:1,是什么?(指‘健康状况’和‘危险因素’的水平和分布特征)2,为什么?其中核心任务是阐明疾病与致病因素(通常叫危险因素)之间的因果关系。弄清了这些问题,才知道该这么办?这头二个问题离不开统计分析。SAS就为了提供这种统计分析服务。统计分析软件包有很多,但SAS已为世界各国所公认。有的国际组织甚至非用它分析的结论不接受。当然,用SAS不光限于科学研究者。各行各业都能用到。

今天我向大家介绍的恐怕不到SAS功能的千分之一,但它包括使用SAS的几个主要步骤。会了它就可以作粗步分析,并在此基础上,自己翻书往深入做了。

通常,我们要对事件作调查(包括实验、检验),然后对获得的所有信息加以存储、分析、作出结论。你们这次做了一个居民健康调查,是现况调查,属于描述流行病学方法,只解决第一个问题,但对第二个问题也会得到许多提示和线索。如过二年再对同一人群做一次调查,那就成为前瞻性调查,属于分析流行病学方法,就能分析因果关系了。

为了讲应用SAS的方法,首先讲一下计算机应用中的某些概念。先让我演示一下你们的调查数据,让你们对你们的数据有一个最直观的印象。(运行c:mblvar.pgm)

1,概念:

数据集:(data file)你调查获得的所有信息,首先要存储起来,建成一个数据集。

变量: (Variable简称Var)每一种信息,在统计分析里叫变量。为分析方便,对每一个变量要给它取个名,叫变量名(8个英文字母以内);再赋值,叫变量值(数据)。

变量值有三种类型:字符型、数字型和日期型。如姓名是字符型,出生年月日是日期型,年龄是数字型。数字型还分真数,带小数(real),和整数,不带小数(integer)。如:

姓名name 出生日期birth 年龄age 身高ht

XUZHAOYI 06/20/92 8 140.6

变量的性质:变量有‘有序的变量’和‘无序的变量’之分。一些计量的数据都是有序的,如身高、体重。。。。能由小到大、由轻到重来进行分析。或一些分级数据,如文化分‘文盲、小学、中学。。’收入分‘不到100元、100-299、300-400、。。’也可算有序的,但不能平均。有些则是无序的,如‘婚姻状态’有‘未婚、已婚、离婚、再婚、丧偶’它们之间没有数量级的关系。在输入时可以赋值为1、2、3、4、5分别代表5种状态,但不能以数值进行均数、回归分析等。应把它看作字符型变量处理。有的文章在做分析时也把它作为一个有序变量,SAS也能做,但结果显然十分可笑。

SAS的数据集格式:任何一个软件都有自己的数据集格式。SAS软件只认SAS数据集格式。用别的方式输入的数据,要先转换成SAS数据集,才能用SAS分析。

通常我们用Dbase, Epi-info, Excel等方式输入。再用适当软件转换成SAS数据集。取个文件名以便调用,名字不超过8个字母。再转换成永久性数据集,(SAS用双重命名法)文件后缀为‘.sd2’,如 “*****.sd2”。

例1,一个简单的数据集:调查了一个班儿童的健康

ID name sex birth age 身高ht 体重wt

001 XUZHAOY m 06/20/92 8 140.6 35.5

002 LULAOSA f 01/30/93 7 135.3 30.1

003 。。。。。。

在输入实践中,变量名常用简单符号,如ht,wt,但更多是用问卷上的一个代码, 如A1,B02,B021,B022等。

过程:这是SAS软件中设计好的分析程序,可以直接调用。如你要分析频率,你可以调用proc freq; 你要分析回归,你可以调用proc reg. 这proc就是procedure的意思。

应用程序:你要用SAS软件来分析你的一堆数据,都要自编一个应用程序以命令SAS软件为你干些什么。此程序必包含二个步骤:

数据步(data步)和 过程步(proc步)。

data步先处理好你的数据集,如变量的转换等。然后调用proc步进行分析。

程序试运行:我先用你们的实例运行一下,看看出现什么结果,让你们有一个总的印象。然后再按部就班地逐项讲解。

SAS的几个窗口:程序窗口(Program)逻辑窗口(Log)和结果窗口(Outcome)命令窗口(Command),常用inc…,file…,top,bottom,bye…….。

功能键:F4—程序回忆,F5—程序窗口,F6—逻辑窗口,F7—结果窗口

2,数据集的建立:SAS数据集二种建立方法:

2-1直接输入法。在处理分析一组小数据时,可直接输入。需先为它取个文件名(任意8个以内的字母)。

Data abc;

input 姓名$ 生日mmddyy8. 体重 @@;(变量名不超过8个字。 这里$代表字符型变量;mmddyy8.代表日期变量;无特殊标记代表数值型变量。)

cards; (表示下面开始数据行)

XZY 02/25/52 62.5 ZLS 10/01/42 51.8(数据间要留空格)

... http://172.16.241.212/upwordserver/tmp/php1dGdIG/http://172.16.241.212/upwordserver/tmp/php1dGdIG/.. ... ... http://172.16.241.212/upwordserver/tmp/php1dGdIG/http://172.16.241.212/upwordserver/tmp/php1dGdIG/.. ...(@@连续读入数据行)

; (注意:每句命令后必须有“;” 的符号)

run; (程序结束用run;表示要它运行)

这样形成的数据集是临时数据集。如加上以下语句,就成永久性数据集。

libname p 'c:mb';

data p.abc;

。。

2-2 从别的文件转读过来的SAS数据集。此处只介绍从EPIINFO 数据库转入的方法。比较大的数据集,都应先建立某种数据集,而不能现输入。EPIINFO很适合此项任务。

已经建立了一个EPIINFO数据集L.rec 。先把这它用EPIINFO中的EXPORT功能转换成L.sas。再用SAS读入(在命令框用inc 命令),然后加一个永久性的文件标示(我习惯用p来表示),形成L.sd2供SAS分析用的数据集。

演示:用程序窗口中的命令口,inc c:MBL.sas

你们看它已变成SAS数据集所需要的输入格式。不同的是数据都是紧挨着的,识别数据靠在变量后标示的位置。每行78个位,不够时换一行,用“/”隔开。日期表示法要改。

对变量的标识方法要按SAS的要求稍作修改:

如把日期表示法要改过来(EPIINFO用“$X-X”而SAS用“ mmddyy8.” )

最后在末行加run;(可利用程序窗口中的命令口,给命令 bot 就到文件底部了)

3,DATA 步:

目的是对变量进行修改、转换、分级、产生新变量等。常用语句有:

算术式 有 +、-、*、/、=、>= 、<= , ( eq, ge, le, )

涵数: 算术涵数 max(X,Y,..)、min(X,Y,..)、mod(X,Y)、

取整涵数int(X)、round(X)、

代数涵数exp(X)、log(X)、log2(X)、log10(X)、

统计涵数sum(X)、mean(X)、max(X)、min(X)、

日期涵数year(X)、month(X)、day(X)、

weekday(X)、today()、mdy(月,日,年)、

这里的X,Y,月,日,年,都是你文件里的相应变量名。

条件句:if (。。条件) then (运算式 X=Y*2 );else X=Y/2;

逻辑语 or、and、not ;如if 。。。or 。。。then 。。。。。。;

Label标签语句使打印变量时,使用更清楚的说明(注释)。

例示:

现在我们来解释L.PGM 的语句:

libname p 'c:mb'; **开头用此命令,指出‘永久文件’存放在什么地方。

data a; **指建立了一个临时性文件a,它在离开SAS后就不存在了。

set data p.l; ** set表示取下文件,在文件‘l’前加了一个‘p.’就指

示这个文件是永久性文件。

** 首先改错。一个材料上来,千万不要立即着手分析。先要进行逻辑检错,然后

编程序改错。此阶段可能要几天至几月时间。

label ID = ' 编号 ' 把每个变量标示为易懂的‘名词’

XUEXIAO = ' 学校 '

L01 = ' 对表理解 '

L02 = ' 填表用时 ' ;

要生成一些新的变量:

a01r=15; 假设出生日期是15号

shengri=mdy(a01y, a01r, a01n); 利用日期涵数mdy(月,日,年)

today=today( );

itday=today-600;

nianl=int((itday-shengri)/365); 年龄是调查日 - 生日的天数/365天

关于日期的几种表示和计算方法见date.pgm

if 0<nianl<11 then nl=0; 年龄分组

if 10<nianl<18 then nl=1;

if 17<nianl<30 then nl=2;

if 29<nianl<40 then nl=3;

if 39<nianl<50 then nl=4;

if 49<nianl<60 then nl=5;

if nianl>59 then nl=6;

tz=a07/2; 体重由斤变为公斤

sg=a08/100; 身高由厘米变为米

bmi=tz/sg/sg; BMI肥胖指数的公式

if bmi>=25 then cz=1; else cz=0; 超重的定义

if bmi>=27 then fp=1; else fp=0; 肥胖的定义

if c04=1 then cxy=1; else cxy=0; 定义曾吸烟

if c06=1 then xxy=1; else xxy=0; 定义现在吸烟

xynl=0; 定义开始吸烟的年龄分组

if 0<c05<=17 then xynl=1;

if 17<c05<=29 then xynl=2;

if c05>29 then xynl=3;

xyl=0; 定义吸烟量(支/日)分组

if 0<c07<=9 then xyl=1;

if 10<=c07<=19 then xyl=2;

if c07>19 then xyl=3;

3,Proc 步; 调用内置程序进行分析:

proc means; 求变量的均数、最大最小值。可用VAR指定特定变量。

label A01R= ' date of birth' 可用中英文,要用‘ ’。

SHENGRI= ' birthday'

XXY= ' current smoking'

XYL= ' cigarettes per day' ;

run; 每个程序最后用此命令运行

** lproc.pgm **

data b;

set a;

proc freq; tables a05 xynl; 求单变量的频率分布

label xynl= ' 开始吸烟年龄 ';

proc freq; tables nl*(cz fp xxy b0303 b0304 b0306 b0307 b0308);

求二个变量的频率分布(四格表)

label cz= ' over weight '

fp= ' fatness '

nl= ' age group '

xxy= ' current smoking ' ;

proc freq; tables a02*b0317*nl; 求三个变量分层的频率分布

label nl= ' 年龄组 '

B0317 = ' 骨疏松 ';

proc univariate plot; var bmi ; 求单变量的分布并作图

proc ttest; class a02 ; var bmi; 作二组均数的差异显著性测验

proc anova; class nl; model bmi=nl; means nl/snk; 多组均数的方差分析

proc anova; class a06; model bmi=a06; means a06/snk;

proc anova; class h03; model bmi=h03; means h03/snk;

proc anova; class h05; model bmi=h05; means h05/snk;

proc anova; class xyl; model bmi=xyl; means xyl/snk;

run;

data c; 作二组和多组频率的差异显著性测验,求OR值。

set a;

if cz=1 or fp=1 then fei=1; else fei=0;

if nl<5 then nll=1; else nll=2;

if a06<3 then a066=1; else a066=2;

if h03<2 then h033=1; else h033=2;

if h05<3 then h055=1; else h055=2;

proc freq; tables fei*(nl a06 h03 h05 xyl)/chisq norow nopercent;

proc freq; tables fei*(nll a066 h033 h055 xxy)/cmh norow nopercent;

run;

data d; 进一步分析某一疾病的特征、和其他因素间的关系

set a;

proc corr; var b0307 b0308 b0310 b0304; 求四种疾病间的相关系数

proc freq; tables a02*b0307/cmh;

proc freq; tables b0307*(a04 a06 xxy d01 d041 d042 I902)/chisq nopercent norow;

run;

data e; 进一步分析高血压病和哪些因素有关系

set a;

if a02=1; 只分析男性

if d041=. then d041=0; 把缺损值填上,作为0

if d042=. then d042=0;

yali=0; 新设立一个变量叫‘压力’

if i02=1 or i03=1 or i04=1 or i05=1 or i06=1 or i08=1 or i20=1 or i22=1 or

i23=1 or i30=1 then yali=1;

yalida=i02+i03+i04+i05+i06+i08+i20+i22+i23+i30; 新设立一个变量叫‘压力大’

yalidada=0; 新设立一个变量叫‘压力大大’

if 0<yalida<3 then yalidada=1;

if yalida ge 3 then yalidada=2;

proc freq; tables b0307*(i01 i02 i03 i04 i05 i06 i07 i08 i09 i10

i11 i12 i13 i14 i15 i16 i17 i18 i19 i20

i21 i22 i23 i24 i25 i26 i27 i28 i29 i30

i31 i32 i33 i34 i35 i36 i37 i38 i39 i40 i41 i42 i43 )/nopercent norow;

proc freq; tables b0307*(yali yalida yalidada)/chisq nopercent norow;

proc logistic descending; model b0307=nl a04 bmi xyl d042 h02 yalidada;

run;

5,文件的拆并: (关于文件的拆并方法见lfile.pgm)

为了分析的需要,有时要对文件进行合并和拆分。先说合并:

5-1,纵向合并,如几个地方输入的资料(相同格式)要合并在一起。

Data a; 将要形成的文件a 。

Set b c; 把文件b 和c 上下合并起来。

Run;

5-2,横向合并,如同一批人有二种调查资料,每个人的流调表和体检表要合并起来。

Data bb; 把要合并的文件b理顺一下,形成文件bb 。

Set b;

Proc sort; by ID; 先把要横向合并的文件按唯一变量ID(个人编号)排一下序。

Data cc; 同上述形成文件cc 。

Set c;

Proc sort; by ID;

Data a; 将要形成的文件a 。

merge bb cc; by ID; 把文件bb 和cc按每个人的ID号横向合并起来。

Run;

5-3,拆分一个文件时,只要给它一个拆分的条件,用IF语句。

data a;

set p.l;

if A02=1; 形成的文件a里只包括男性。

run;

data b;

set p.l;

if A02=2; 形成的文件b里只包括女性。

run;

IF 的条件随你的需要,如:

if ID>500;(按个人编号拆,要ID大于500的记录)。

if _N_<101; (按记录条数拆,只要第1-100个记录)。

if nl > 6; (只要年龄大于60岁的老年人,做分析)。

6, 结果解释:

6-1,对单个变量分布特征的分析:

proc univariate 和proc univariate plot;形成的表和图的解释:

四分位数,中位数,平均数,极端值。

茎叶图(STEM-LEAF)非常形象的频数图,茎表示十位或百位数值,叶表示个位数值。

箱式图(BOXPLOT)三条水平线是表示四分位的位置,中间的+表示均值,上下底线间为四分位间距,从底线往上或下开始到四分位间距的1.5倍处用‘|’,1.5~3.0倍 间用‘O’表示,3.0倍以外用‘*’表示。

正态概率图:图中的‘+’表示参考曲线,‘*’表示实测值。更好的曲线分布可用insight功能,本次不讲了。

6-2,对二个以上变量相互关系的分析:

6-2-1,对计数指标(2*2)四格表的差异显著性检验,求卡方(chisq),和OR值。

Proc freq;tables A*B*C/chisq cmh :

给出几个卡方值。第一个是一般卡方值(Pearson卡方)。第二是似然比卡方值,第三是连续性校正的卡方值,用于当有期望值小于5,而总数n大于40时。如果出现有期望值小于5,而总数n小于40时,就要用精确检验法(Fisher's Exact Test)。它能自动提供精确检验法的卡方值。第四是C-M-H卡方值,可用于多层2*2表。Cochran's test是二个内部构成不同的频率比较时,作加权后的卡方。Mantel-Haenszel方法消除了层次因素的干扰而提高了检出关联的把握度。把需要校正的因素(如医院)放在另外二个因素的前面,即Proc freq;tables 医院*B*C;但各医院的方向应该一致。

Breslow-Day Test for Homogeneity(Breslow-Day对同质性的检验),就是提供这种检验。

如果p<0.05表示各层(医院)间不同质(效果方向不一致),则不能用总的OR表示总的疗效比较。

6-2-2,对行*列(S*R)多格表时,求卡方(用Cochran-Mantel-Haenzsel 法cmh选项)。

Mantel-Haenszel给出三个统计量,①第一个检验行和列间非零相关,用于双向有序的表。含有线性相关的意思。②第二个检验行平均得分不同,用于列变量为名义变量,行变量为有序变量。在2*R或多层2*R表时也可用此行平均得分检验。如检验二种疗法哪个疗效更好。③第三个检验一般关联,用于双向无序行*列表。一般关联的卡方检验只能得出两种变量间是否存在关联,不能得出哪组得分更高(如含义疗效更好)的结论。

6-3,对计量指标分析时,可用t检验、方差分析、相关分析、回归分析等。

Proc ttest; class X(分组变量);var Y;(分析变量)

它会给出方差齐或不齐时的二种t值供选用。

Proc Anova; class X;model Y=X ;(分析变量 = 分组变量)

Proc Corr; Var X Y;

Proc Reg; model Y=a b c;

7,体会和教训:

7-1,进入分析前,对数据改错非常重要。

7-2,只保存一个最终程序和一个原始数据库,不要保存许多分析中间产生的数据文件。

7-3, SAS带来的方便和问题。

7-4,编写好程序,确定下来以前,要寻另一位有经验的高级医师检查复核。

围棋入门规则

财务入门基础知识

跆拳道入门学习方法

讲话稿写作入门

政务信息写作入门

本文标题: SAS快速入门
链接地址:https://www.dawendou.com/fanwen/qitafanwen/2189666.html

版权声明:
1.大文斗范文网的资料来自互联网以及用户的投稿,用于非商业性学习目的免费阅览。
2.《SAS快速入门》一文的著作权归原作者所有,仅供学习参考,转载或引用时请保留版权信息。
3.如果本网所转载内容不慎侵犯了您的权益,请联系我们,我们将会及时删除。

重点推荐栏目

关于大文斗范文网 | 在线投稿 | 网站声明 | 联系我们 | 网站帮助 | 投诉与建议 | 人才招聘 | 网站大事记
Copyright © 2004-2025 dawendou.com Inc. All Rights Reserved.大文斗范文网 版权所有