sas中数据的输入格式一般分为2种,一种是直接输入,另一种是循环输入。input 后跟几个变量名,数据卡cards就要据此逐次处理,且一定是倍数关系。
1.直接输入在自变量及数据较少的情况下较好使用。
例:
甲、乙、丙三个奶牛场高产奶牛、低产奶牛、低产奶牛头数统计如下,试问三个奶牛场高、中、低产奶牛的构成比是否有差异。
场 地 |
高产奶牛 |
中产奶牛 |
低产奶牛 |
甲 |
32 |
15 |
18 |
乙 |
28 |
26 |
10 |
丙 |
11 |
38 |
16 |
data cow;
input a b c@@;
cards;
1 1 32 1 2 15 1 3 18
2 1 28 2 2 26 2 3 10
3 1 11 3 2 38 3 3 16
;
proc freq;
table a*b/chisq;
weight c;
run;
该程序将a视作场地类型,将b视作奶牛种类,将c视作奶牛个体数量。
input使用了 a b c,则数据卡cards内的数据必须严格按照a b c a b c……这样的数据进行布置。
此外,换行虽然对程序无影响,但是可以更美观,减少输错数据的可能。
2.循环输入在自变量及数据较多且数据长短一致的情况下较好使用。
例:
从7名健康人体中抽取血样,每个受试者的血样分成4份,然后随机地将4份血样分别放置10、20、30、40 min测定其血糖浓度,资料如下表。试检验不同受试者和放置不同时间的血糖浓度有无显著差异。
不同受试者、放置不同时间血滤液的血糖浓度(mg/100ml)
受试者编号 |
放置时间(min) |
|||
10 |
20 |
30 |
40 |
|
1 |
95 |
95 |
89 |
83 |
2 |
95 |
94 |
88 |
84 |
3 |
106 |
105 |
97 |
90 |
4 |
98 |
97 |
95 |
90 |
5 |
102 |
98 |
97 |
88 |
6 |
112 |
112 |
101 |
94 |
7 |
105 |
103 |
97 |
88 |
如果用直接输入,则数据卡输入过长:
data xxxx;
input a b c@@;
cards;
1 1 95 1 2 95 1 3 89 1 4 83
2 1 95 2 2 94 2 3 88 2 4 84
3 1 106 3 2 105 3 3 97 3 4 90
4 1 98 4 2 97 4 3 95 4 4 90
5 1 102 5 2 98 5 3 97 5 4 88
6 1 112 6 2 112 6 3 101 6 4 94
7 1 105 7 2 103 7 3 97 7 4 88
;
proc anova;
class a b;
model c=a b;
means a b/snk;
means a b/snk alpha=0.01;
run;
此时用do ……end;启动循环输入效率更高。
data bs;
do a=1 to 7;
do b=1 to 4;
input c@@;
output;
end;
end;
cards;
95 95 89 83
95 94 88 84
106 105 97 90
98 97 95 90
102 98 97 88
112 112 101 94
105 103 97 88
;
proc anova;
class a b;
model c=a b;
means a b/snk;
means a b/snk alpha=0.01;
run;
do a=1 to 7;表明, a变量从1到7共有7个种类(对应7位受试者编号)
do b=1 to 4;表明,b变量从1到4共有4个种类(对应4种放置时间)
在循环输入中,input后必须紧紧跟着output;
output指的是将循环输入的数据放入数据卡cards内,缺少此句一定有误。
output后根据do的数量补上end;的数量,end表示一个循环结束。【前面有2个do语句,后面必须加上几个end语句,不然循环不算结束】
do a=1 to 7;do a在前,对应了最后一个end;
do b=1 to 4; do b 在后,对应第一个end;
使用缩进可以看的更加清楚:
data bs;
do a=1 to 7;
do b=1 to 4;
input c@@;
output;
end;
end;
循环的逻辑是:
1:声明a从1到7,a的循环最开始是a=1,
2:声明b从1到4,b的循环最开始b=1 ;
3:input c,输入一个数据c ;即a=1 b=1 时c的值;
4:output;将当前所处循环的位置加到数据卡cards内,即cards内第一个数c【即 a=1 b=1 时c=95】
5:因为离input最近的do b……循环未结束, 所以将b=1自动加1,变为b=2;
6:input c,输入一个数据c ;即a=1 b=2 时c的值;
7:output;将当前所处循环的位置加到数据卡cards内,即cards内第一个数c【即 a=1 b=2 时c=95】
……
当b=4运行完时,离input最近的do b……循环结束,但其仍处于do a……循环中,a=1变为a=2,此时b重新从1算起,即b=1,input c指的是【a=2 b=1时 c=95】
……
直到a循环结束,整个数据输入才是最终结束。