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;

Snipaste_2023-05-01_00-39-56.png

此外,在统计分析的 PROC 中,往往使用 CLASS 语句,可以适应更多类型的模型,比如分析交互影响。