%CrossTableBase 使用指南

%CrossTableBase 使用指南

1. 功能

R×C列联表,计算频数及频率(可选)。

2. 语法

  • %CrossTableBase()
  • %CrossTableBase(help)
  • %CrossTableBase(requried-argument-1, requried-argument-2, requried-argument-3 <, optional-argument-1 <, optional-argument-2> <, ...>>)

Tips : 运行%DESC_COUN()%DESC_COUN(help)将会在浏览器中打开帮助文档。

2.1 Requried Argument

INDATA = <libname.>dataset(dataset_options)

指定用于生成交叉表的分析数据集,可包含数据集选项

libname: 数据集所在的逻辑库名称

dataset: 数据集名称

dataset_options: 数据集选项,兼容 SAS 系统支持的所有数据集选项

Example :

  • INDATA = ANALYSIS
  • INDATA = SHKY.ANALYSIS
  • INDATA = SHKY.ANALYSIS(where = (FAS = "Y"))

ROWCAT = variable

ROWCAT = variable("value-1" <"value-2" ...>)

指定列联表的行变量,同时可手动指定具体的分类值。[示例代码](#4.2 指定单个分析变量)

若参数 ROWCAT 未指定具体的分类值,分析数据集的行变量中的所有非缺失值将参与行分类的统计,不重复的非缺失值的数量即为行变量的分类数;

若参数 ROWCAT 指定了具体的分类值,指定的分类值的数量即为行变量的分类数,未指定但存在于分析数据集的行变量中的其他分类值将不参与行分类的统计。

Caution :

  1. 参数 ROWCAT 不允许指定不存在于参数 INDATA 指定的数据集中的变量;
  2. 参数 ROWCAT 不允许指定数值分类,例如:ROWCAT = PARSIGN(1 2 3) 是不被允许的;
  3. 参数 ROWCAT 允许指定重复的分类值,但没必要。

Example :

  • ROWCAT = PARSIG
  • ROWCAT = PARSIG("正常" "异常无临床意义" "异常有临床意义")

COLCAT = variable

COLCAT = variable("value-1" <"value-2" ...>)

指定列联表的列变量,可手动指定具体的分类名称,用法同参数 ROWCAT。

Caution :

  1. 若参数 ROWCAT 与 COLCAT 指定了相同的变量名,输出结果可能是非预期的。

2.2 Optional Argument

OUTDATA = <libname.>dataset(dataset_options)

指定列联表统计结果的输出数据集,可包含数据集选项。[示例代码](#4.4 指定输出格式)

Default : CrossTable


ROWCAT_BY = variable<(ASC<ENDING>|DESC<ENDING>)>

指定列联表中行变量的排序依据。[示例代码](#4.5 指定排序方式)

Default : #AUTO

根据参数 ROWCAT 的值的不同情况,宏程序将根据以下逻辑对行分类进行排序:

  1. 若参数 ROWCAT 指定了具体的分类值,则按照各个分类指定的顺序进行排序,参数 ROWCAT 指定的第一个分类将输出至列联表的第一行,指定的第二个分类将输出至列联表的第二行,以此类推。此时将忽略参数 ROWCAT_BY 的值;
  2. 若参数 ROWCAT 未指定具体的分类值,则考虑参数 ROWCAT_BY 指定的值。
    • 若参数 ROWCAT_BY 指定为默认值 #AUTO,则按照默认顺序对行分类值进行排序;
    • 若参数 ROWCAT_BY 指定为一个变量名,则根据行分类值在分析数据集中对应的该变量的值进行排序。例如:指定参数 ROWCAT = PARSIG, ROWCAT_BY = PARSIGN,宏程序自动获取变量 PARSIG 的分类为:“异常无临床意义”、“异常有临床意义”、“正常”,在分析数据集中对应的 PARSIGN 的值分别为:2、3、1,宏程序将首先对 PARSIGN 的值进行排序,根据排序结果调整 PARSIG 的分类顺序,若 PARSIGN 存在重复值,则根据 PARSIG 的值进一步排序。排序方向可手动指定为顺序或逆序排列,若未指定排序方向,则默认为升序排列。

Example :

  • ROWCAT = PARSIGN
  • ROWCAT = PARSIGN(DESC)
  • ROWCAT = PARSIGN(DESCENDING)

COLCAT_BY = variable<(ASC<ENDING>|DESC<ENDING>)>

指定列联表中列变量的排序依据,用法同参数 ROWCAT_BY。[示例代码](#4.5 指定排序方式)

Default : #AUTO


ADD_CAT_MISSING = TRUE|FALSE <TRUE|FALSE>

指定是否在列联表的行或列中添加“缺失”分类。[示例代码](#4.6 指定缺失值处理方式)

参数 ADD_CAT_MISSING 的第一个值控制列联表的行是否添加“缺失”分类,第二个值控制列联表的列是否添加“缺失”分类。

Default : FALSE FALSE

Caution :

  1. 若参数 ADD_CAT_MISSING 仅指定了一个值,则对列联表的行或列中是否添加“缺失”分类均应用相同的策略;

ADD_CAT_OTHER = TRUE<(TYPE = 1|2)>|FALSE <TRUE<(TYPE = 1|2)>|FALSE>

指定是否在列联表的行或列中添加“其他”分类。

参数 ADD_CAT_OTHER 的第一个值控制列联表的行是否添加“其他”分类,第二个值控制列联表的列是否添加“其他”分类。

参数 ADD_CAT_OTHER 指定为TRUE时,“其他”分类的频数计算方式可通过选项 TYPE 进行控制:

  • TYPE = 1 : 将 ROWCAT 或 COLCAT 未指定的分类(排除缺失值)计入“其他”分类,TYPE = 1 为默认选项;
  • TYPE = 2 : 将 ROWCAT 或 COLCAT 未指定的分类(包含缺失值)计入“其他”分类;

Default : FALSE FALSE

Caution :

  1. 若参数 ADD_CAT_OTHER 仅指定了一个值,则对列联表的行或列中是否添加“其他”分类均应用相同的策略;
  2. 若参数 ADD_CAT_OTHER 指定了TRUE,但未指定选项 TYPE,则使用默认选项值 TYPE = 1;

ADD_CAT_ALL = TRUE|FALSE <TRUE|FALSE>

指定是否在列联表的行或列中添加“合计”分类。

参数 ADD_CAT_ALL 的第一个值控制列联表的行是否添加“合计”分类,第二个值控制列联表的列是否添加“合计”分类。

Default : TRUE TRUE

Caution :

  1. 若参数 ADD_CAT_ALL 仅指定了一个值,则对列联表的行或列中是否添加“合计”分类均应用相同的策略;

N = numeric

指定实际合计频数。

Default : #AUTO

默认情况下,参数 N 的值为参数 INDATA 指定的数据集的观测总数 n_obs,若参数 ADD_CAT_MISSING 指定的值为 FALSE FALSE (默认值)时,行变量与列变量均为缺失值的观测将不计入观测总数 n_obs

Caution :

  1. 通常情况下 N 应当是一个不小于分析数据集观测数 n_obs 的正整数,但当参数 N 被指定为负数、零或正浮点数时,宏程序仍将继续运行,但结果可能是非预期的。

  2. 参数 N 的值将影响列联表中所有单元格频率的计算;

  3. 参数 N 的值仅影响列联表中某些单元格频数的计算,具体如下(红色×即为受影响的单元格频数):

    列分类1 列分类2 缺失 其他(类型1) 其他(类型2) 合计
    行分类1 - - - - - -
    行分类2 - - - - - -
    缺失 - - × - × ×
    其他(类型1) - - - - - -
    其他(类型2) - - × - × ×
    合计 - - × - × ×

PCT_OUT = TRUE|FALSE

指定是否计算列联表中行列各个单元格的百分比。[示例代码](#4.9 指定首行标签)

Default : FALSE


FORMAT = format

指定百分比的输出格式,该参数仅在 PCT_OUT = TRUE 时生效。[示例代码](#4.10 指定首行标签是否额外缩进)

Default : PERCENTN9.2


3. 细节

3.1 参数

  1. 宏程序含有3个位置参数:INDATA, ROWCAT, COLCAT,其余参数均为关键字参数;
  2. 传入的参数将打包传递给宏变量 SYSPBUFF,由于使用了可变参数的编程方式,调用此宏程序时,未定义但已传入的参数将被忽略。

3.2 输出数据集

  1. 输出数据集为一个R×C表的结构,行分类和列分类的组合构成数据集的主体部分,默认情况下还将输出行合计和列合计的频数及频率;
  2. 若参数 ADD_CAT_MISSING 指定了行和(或)列变量为 TRUE,则额外输出“缺失”分类的频数及频率;
  3. 若参数 ADD_CAT_OTHER 指定了行和(或)列变量为TRUE,则额外输出“其他”分类的频数及频率;
  4. 对于行分类的排序方式:参数 ROWCAT 指定的行变量的分类值按参数 ROWCAT_BY 指定的排序变量及排序方向进行排序,若参数 ROWCAT 使用了手动指定分类值的方式,将按照手动指定的顺序进行排序(此时参数 ROWCAT_BY 的值将被忽略);若额外指定了“缺失”、“其他”、“合计”分类,则按照“缺失”、“其他”、“合计”的顺序排序;列分类的排序方式同上所述;
  5. 输出数据集的列名以 COL_开头,按照列分类的顺序,使用数字作为后缀依次命名:COL_1、COL_2、COL_3、......,“缺失”分类的列名为 COL_MISSING、“其他”分类的列名为 COL_OTHER、“合计”分类的列名为 COL_ALL,此外第一列的内容为行变量的分类名称,列名为 COL_0;

4. 例子

4.1 打开帮助文档

%CrossTableBase();
%CrossTableBase(help);

4.2 指定行、列变量

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2);

上述例子中,行变量为 PARSIG1,列变量为 PARSIG2,宏程序根据变量 PARSIG1 与 PARSIG2 的分类值自动构建列联表。

%CrossTableBase(indata = analysis1, rowcat = PARSIG1("正常" "异常无临床意义" "异常有临床意义"), colcat = PARSIG2("正常" "异常无临床意义" "异常有临床意义"));

上述例子中,行列变量均通过参数指定了各自的分类值,因此宏程序将根据分类值及出现的顺序构建列联表。

4.3 指定行、列变量的分类值的排序变量和方向

%CrossTableBase(indata = analysis, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N);

上述例子中,通过参数 ROWCAT_BY 和 COLCAT_BY 对行变量 PARSIG1 和列变量 PARSIG2 的分类值的排列顺序进行控制,由于未指定排序方向,因此默认使用升序排列。

%CrossTableBase(indata = analysis, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N(desc), colcat_by = PARSIG2N(desc));

上述例子中,通过参数 ROWCAT_BY 和 COLCAT_BY 对行变量 PARSIG1 和列变量 PARSIG2 的分类值的排列顺序进行控制,并同时指定了降序的排列方式。

4.4 指定是否计算“缺失”分类

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE);

上述例子中,参数 ADD_CAT_MISSING 指定行列变量均计算“缺失”分类。

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE FALSE);

上述例子中,参数 ADD_CAT_MISSING 指定行变量计算“缺失”分类,列变量不计算“缺失”分类。

4.5 指定是否计算“其他”分类

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE, add_cat_other = TRUE);

上述例子中,参数 ADD_CAT_OTHER 指定行列变量均计算“其他”分类,由于未指定计算类型,因此按默认处理方式,缺失值不纳入到“其他”分类中。

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE, add_cat_other = TRUE(type = 2));

上述例子中,参数 ADD_CAT_OTHER 指定行列变量均计算“其他”分类,由于指定了 TYPE = 2,因此缺失值也被纳入到“其他”分类中。

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE, add_cat_other = TRUE(type = 1) TRUE(type = 2));

上述例子中,参数 ADD_CAT_OTHER 指定行列变量均计算“其他”分类,对于行变量 PARSIG1,指定了 TYPE = 1,因此 PARSIG1 的缺失值不纳入到行分类的“其他”分类中,对于列变量 PARSIG2,指定了 TYPE = 2,因此 PARSIG2 的缺失值被纳入到列分类的“其他”分类中。

4.6 指定是否计算“合计”分类

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE, add_cat_other = TRUE, add_cat_all = TRUE);

上述例子中,参数 ADD_CAT_ALL 指定行列变量均计算“合计”分类,这也是宏程序的默认处理方式。

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE, add_cat_other = TRUE, add_cat_all = FALSE);

上述例子中,参数 ADD_CAT_ALL 指定行列变量均不计算“合计”分类。

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE, add_cat_other = TRUE, add_cat_all = TRUE FALSE);

上述例子中,参数 ADD_CAT_ALL 指定行变量计算“合计”分类,列变量不计算“合计”分类。

4.7 指定实际的合计频数

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE TRUE, add_cat_all = TRUE TRUE, n = 50);

上述例子中,参数 N 指定了实际的合计频数为50,超过了分析数据集 ANALYSIS1 的观测总数,此时说明存在某些行变量 PARSIG1 和 列变量 PARSIG2 均缺失的观测,由于未记录 PARSIG1 和 PARSIG2 的值,导致分析数据集的观测总数低于实际的合计频数。

4.8 指定是否计算频率

%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE TRUE, add_cat_all = TRUE TRUE, pct_out = TRUE);

上述例子中,参数 PCT_OUT 指定宏程序计算列联表中每个单元格对应的行列分类组合的频率。

4.9 指定频率的输出格式

proc format;
    picture srate(round)
            0 = "0"(noedit)
            0 < - < 1 = "009.99%"(multiplier = 10000)
            1 = "100%"(noedit);
run;
%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE TRUE, add_cat_all = TRUE TRUE, pct_out = TRUE, format = srate.);

上述例子中,参数 FORMAT 指定了一个自定义输出格式 SRATE.,宏程序使用该格式输出频率。

4.10 指定输出数据集

/*指定输出数据集*/
%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE TRUE, add_cat_all = TRUE TRUE, pct_out = TRUE, outdata = result);
/*指定输出数据集和数据集选项*/
%CrossTableBase(indata = analysis1, rowcat = PARSIG1, colcat = PARSIG2, rowcat_by = PARSIG1N, colcat_by = PARSIG2N, add_cat_missing = TRUE TRUE, add_cat_all = TRUE TRUE, pct_out = TRUE, outdata = result(rename = (COL_0 = ROWCAT COL_1 = NORMAL COL_2 = NCS COL_3 = CS COL_MISSING = MISSING COL_ALL = ALL)));

5. 更新日志

V1.0

  • 新创建宏程序
posted @ 2022-09-21 22:53  Snoopy1866  阅读(102)  评论(0)    收藏  举报