转置重复测量数据时无法正确创建时间变量的技术问题
解决SAS转置后生成时间变量的问题
问题根源
- 转置后的
longcog数据集已将宽表的cog1-cog6转换为长表的行记录,原始变量cog1-cog6不再存在,后续data longcog2中引用这些变量必然触发"未初始化"错误。 - 将
cog1-cog6加入proc transpose的by语句是错误操作:by变量用于指定分组维度(需为不随时间变化的变量),加入随时间变化的认知指标后,会导致每个ID的分组数剧增,最终数据重复。
修正方案
方案1:从转置后的cog变量提取时间值
转置后cog变量存储的是cog1、cog2这类字符串,可通过字符串截取+类型转换直接生成time变量:
/* 原转置代码无需修改 */ proc transpose data=ucognition out=longcog (rename=(col1=CogScore _name_=cog)); by HHIDPN SSRI; var cog1 cog2 cog3 cog4 cog5 cog6; run; /* 生成时间变量 */ data longcog2; set longcog; /* 截取cog变量第4位及以后的字符,转换为数值型时间点 */ time = input(substr(cog, 4), best.); /* 保留所需变量 */ keep HHIDPN SSRI time CogScore; run; proc print data=longcog2 (obs=10); run;
方案2:用条件分支匹配时间值
如果字符串截取方式不适用(比如变量命名规则变化),可通过select语句手动匹配:
data longcog2; set longcog; select(cog); when('cog1') time = 1; when('cog2') time = 2; when('cog3') time = 3; when('cog4') time = 4; when('cog5') time = 5; when('cog6') time = 6; otherwise time = .; /* 处理异常命名的情况 */ end; keep HHIDPN SSRI time CogScore; run;
额外说明
- 转置时
by语句仅需保留不随时间变化的变量(如HHIDPN、SSRI),这些变量在每个时间点的取值一致,是正确的分组依据。 - 最终生成的
longcog2数据集符合MIXED过程要求的长格式:每个ID-时间点对应一行记录,包含ID、分组变量(SSRI)、时间变量(time)和结局变量(CogScore)。
内容的提问来源于stack exchange,提问作者Paige Jones
相关产品推荐
相关产品推荐

