SAS学习第3章:试验数据处理的心决

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;

SAS学习第3章:试验数据处理的心决_第1张图片

循环的逻辑是:

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循环结束,整个数据输入才是最终结束。

你可能感兴趣的:(学习,sas,统计,数据分析)