SAS 几个重要概念辨析
进行变量类型转换,用 input 还是 put
在 SAS 编程过程中,往往会遇到需要转换变量的需求。而转换变量,往往需要考虑使用 INPUT
还是 PUT
。那么这时候就要想想几个变量转换中的几个关键点:
- 源变量是字符型还是数值型?
- 如果源变量是字符型,那么值是字符还是数字?
- 想要转换后的变量是字符型还是数值型?
那么,根据这三个问题的答案,就可以推出是使用 INPUT
还是 PUT
,他们分别有以下几个特点:
PUT()
永远创建字符型变量;PUT()
中的格式参数必须和源变量类型匹配;INPUT()
的源变量必须为字符型变量;INPUT()
可以根据指定的格式,选择创建字符型或者数值型变量。
下面是几个例子:
需求 | 代码 | 源变量类型 | 源变量值 | 返回变量类型 | 返回变量值 |
---|---|---|---|---|---|
PUT 将字符变量转换为字符变量 |
PUT(name, $10.); |
字符型 | ‘Richard’ | 永远是字符型 | ‘Richard ' |
PUT 将数值变量转换为字符变量 |
PUT(age, 4.); |
数值型 | 30 | 永远是字符型 | ’ 30’ |
PUT 将自定义格式转换为字符变量 |
PUT(name, $nickname.); |
字符型 | ‘Richard’ | 永远是字符型 | ‘Rick’ |
INPUT 将值为数字的字符型变量转换为数值变量 |
INPUT(agechar, 4.); |
永远是字符型 | ‘30’ | 数值型 | 30 |
INPUT 将值为数字的字符型变量转换为字符变量 |
INPUT(agechar, $4.); |
永远是字符型 | ‘30’ | 字符型 | ’ 30' |
都用于分类变量:class 与 by 的辨析
SAS中的 BY
语句和 CLASS
语句都允许指定一个或多个分类变量。主要区别在于:
BY
语句进行多次计算分析,每次计算针对数据的一个子集;CLASS
语句会将分组变量包含在分析中,进行一次计算输出结果。
BY
语句会重复对每个子集进行分析,如果输出的结果以表格和图形显示的话,BY
进行的分组分析会输出相同格式的 N 个表格和图形,第一组是一号结果表格,第二组是二号结果表格,以此类推。
CLASS
语句则会将分类变量作为分析的一部分。通常,用于比较各组中,比如 t 检验或 ANOVA 分析。在回归模型中,CLASS
语句可以估计分类变量级别的参数,从而估计每个分类对结局变量的影响。
举例,我们根据 Sashelp.Cars
数据来进行统计分析,进行对比:
data Cars;
set Sashelp.Cars;
where cylinders in (4,6,8) and type ^= 'Hybrid';
run;
proc sort data=Cars out=CarsSorted;
by Origin;
run;
接下来使用 PROC MEANS
进行分组的描述统计:
* 使用 CLASS 语句;
proc means data=Cars N Mean Std;
class Origin;
var Horsepower Weight Mpg_Highway;
run;
* 使用 BY 语句;
proc means data=CarsSorted N Mean Std;
by Origin;
var Horsepower Weight Mpg_Highway;
run;
此外,在统计分析的 PROC
中,往往使用 CLASS
语句,可以适应更多类型的模型,比如分析交互影响。