首页 > 解决方案 > 合并数据集时如何防止 SAS 更改值

问题描述

我正在尝试编写一个 SAS 宏来完成以下工作:

  1. 一个数据集
  2. 定量自变量列表
  3. 分类(一些二元)自变量列表;和
  4. 一个因变量

然后,该宏将为##2-3 中列出的每个变量拟合一个简单的单变量模型,并报告有关每个模型的某些信息以及缺失值的数量。

除了一个细节,我已经让宏工作了:当我最后将两个表合并到一个最终表中时,SAS 似乎正在删除部分字符串。

宏首先为定量自变量拟合模型,将必要的模型信息存储在表格中,然后对分类变量进行同样的操作。

最后一步是将这两个表堆叠在一起。不幸的是,当我这样做时,参数列表的部分字符串正在消失。这里有一些图片可以帮助说明:

这是表格的输出部分,仅基于定量自变量的模型

在此处输入图像描述

这是仅包含基于分类自变量的模型的表的输出部分。请注意,在“参数”下,它列出了虚拟变量的全名

在此处输入图像描述

但是当我去合并/堆叠表格时,SAS正在删除“参数”列中“值”之后的所有内容,用于分类变量的虚拟变量。有关虚拟变量的信息是必要的,否则表格中总结基于分类变量的单变量模型的部分几乎没有意义。

在此处输入图像描述

这是我的代码的一部分。对不起,我不能包含任何数据:

ODS output
NObs=Num_Obs_cat /*Output data on missing observations*/
parameterestimates=parameter_est_cat /*Output each model's parameter estimates*/
OverallANOVA=ANOVA_cat /*Output each model's ANOVA table for the p-value for the model's F-test*/;
proc glm data=long_format_cat;
class Value;
by X_ind;
model &depend=Value/SOLUTION EFFECTSIZE CLPARM;
run;
ODS output close;

/*Create a data set of all of the parameter estimates, with only the necessary columns*/
data parameter_est_cat1 (keep=X_ind parameter estimate probT LowerCL UpperCL rename=probT=p_value);
set parameter_est_cat;
run;

/*Create a data set of each model's F-test p-value*/
data ANOVA_cat1 (keep=X_ind ProbF);
set ANOVA_cat;
where not missing(ProbF); 
run;

/*Create a data set of of each model's missing observations*/
data Num_Obs_cat1 (keep=X_ind NObsUsed);
set Num_Obs_cat;
where Label='Number of Observations Used';
run;

/*Merge the three preceding data sets horizontally*/
data univ_summary_stats_cat;
merge parameter_est_cat1 Num_Obs_cat1 long_format_cat5 ANOVA_cat1;
by X_ind;
run;

/*Merge all of the tables together.  THIS IS THE STEP WHERE I BELIEVE IT'S GOING WRONG.
'univ_summary_stats_quant' has the same columns as 'univ_summary_stats_cat' so they
should be able to be merged/set one on top of each other.  But when I do this, parts of those
strings disappear*/

data univ_all;
set univ_summary_stats_quant univ_summary_stats_cat;
run ;

%修补

请帮忙!

标签: mergesas

解决方案


首先,检查您的日志。您的字符变量可能会出现以下警告:

WARNING: Multiple lengths were specified for the variable ...

univ_summary_stats_cat.首先检查您的set语句中字符串的长度univ_summary_stats_quant,它可能具有较短的可变长度。这意味着当 PDV 初始化时,SAS 将首先获取该数据集中所有变量的长度。如果univ_summary_stats_cat有同名变量,它们将被截断为univ_summary_stats_quant. 为了说明这一点,请考虑以下两个数据集:

data one;
    var = 'Hello';
run;

data two;
    var = 'Hi';
run;

data three;
    set two
        one
    ;
run;

varinthree将被截断,"He"因为varintwo的长度为 2 并被指定为第一个数据集。请注意,日志也有警告。

为了解决这个问题,您可以在length语句之前手动指定语句的长度set,也可以先设置具有最长字符串长度的表。

data three;
    set one 
        two
    ;
run;

如果问题不在set陈述上,而是在merge陈述上,则同样的逻辑适用。


推荐阅读