如何在SAS中计算排除1的最大非对角相关系数
解决SAS中计算相关系数行最大值时排除对角线1的问题
现有数据集
通过PROC CORR输出得到交叉相关系数数据集have,数据如下:
_NAME_ A B C A 1 0.2 0.8 B 0.2 1 0.3 C 0.8 0.3 1
原代码及问题
尝试用以下代码计算每行的最大相关系数:
data want; set have; max_corr = max(of A B C); run;
运行后得到结果:
_NAME_ A B C max_corr A 1 0.2 0.8 1 B 0.2 1 0.3 1 C 0.8 0.3 1 1
由于对角线上的相关系数固定为1,导致计算出的每行最大值均为1,无法获取该行其他相关系数的最大值。
解决方案
方法1:使用IFN函数替换1为缺失值后计算最大值
通过IFN函数将值为1的元素转为缺失值,再调用MAX函数计算(缺失值会被自动忽略):
data want; set have; max_corr = max(of IFN(A=1, ., A) IFN(B=1, ., B) IFN(C=1, ., C)); run;
方法2:使用数组遍历计算
如果相关系数变量较多,用数组遍历更灵活,跳过值为1的元素后记录最大值:
data want; set have; array corr_vars[*] A B C; /* 定义数组包含所有相关系数变量 */ max_corr = .; /* 初始化最大值为缺失值 */ do i = 1 to dim(corr_vars); if corr_vars[i] ne 1 and corr_vars[i] > max_corr then do; max_corr = corr_vars[i]; end; end; drop i; /* 丢弃循环变量 */ run;
期望输出
调整代码后可得到符合需求的结果:
_NAME_ A B C max_corr A 1 0.2 0.8 0.8 B 0.2 1 0.3 0.3 C 0.8 0.3 1 0.8
内容的提问来源于stack exchange,提问作者user860374
相关产品推荐
相关产品推荐

