merge - 合并数据集时如何防止 SAS 更改值
问题描述
我正在尝试编写一个 SAS 宏来完成以下工作:
- 一个数据集
- 定量自变量列表
- 分类(一些二元)自变量列表;和
- 一个因变量
然后,该宏将为##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 ;
%修补
请帮忙!
解决方案
首先,检查您的日志。您的字符变量可能会出现以下警告:
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;
var
inthree
将被截断,"He"
因为var
intwo
的长度为 2 并被指定为第一个数据集。请注意,日志也有警告。
为了解决这个问题,您可以在length
语句之前手动指定语句的长度set
,也可以先设置具有最长字符串长度的表。
data three;
set one
two
;
run;
如果问题不在set
陈述上,而是在merge
陈述上,则同样的逻辑适用。
推荐阅读
- sql - 查询获取不同列过去 30 天的记录
- python - /search/ 'QuerySet' 对象的 AttributeError 没有属性 'facet'
- android - 读取包含链接的 XML 文件 (Android)
- c# - 数组中是否可以有不同颜色的矩形?
- nativescript - HThangEventCreate 失败?
- hyperledger-fabric - 是否可以根据 Hyperledger Fabric 中的实时流量来扩大节点数量?
- android - 我可以只将时间转换为时间戳吗?
- sql - 返回一个包含多列的表
- java - 如何制作一个在我按下时播放歌曲的按钮,一旦我再次按下它就会停止歌曲?
- python - PYTORCH支持的“torch.nn.CTCLoss”和torch_baidu_ctc支持的“CTCLoss”有区别吗?