在SPSS中循环和if语句

时间:2014-01-08 07:10:53

标签: variables loops if-statement spss

我是SPSS的新手,我有点陷入困境。我有大约200个变量,我想循环遍历它们,寻找相关系数大于0.7的变量。我知道我可以使用CORRELATIONS来获得系数矩阵,但是它会很大并且难以查看。基本上,在伪代码中,我想要做的是:

for (i = W1_1 to W1_200) {
    for (j = i to W1_200) {
        if CORRELATIONS(i,j)>0.7 {
            print i, j, CORRELATIONS(i,j)
        }
    }
}

我不能为我的生活在SPSS中解决如何做这些事情。救命啊!

2 个答案:

答案 0 :(得分:0)

SPSS在CORRELATIONS命令上有一个辅助函数来导出相关矩阵。从那里,您可以操纵数据以提供符合您标准的关联对。首先,让我们做一些假数据来说明。

*Making fake data.
set seed 5.
input program.
loop i = 1 to 100.
end case.
end loop.
end file.
end input program.
dataset name test.
compute #base = RV.NORMAL(0,1).
vector X(20).
loop #i = 1 to 20.
compute X(#i) = #base*(#i/20)  + RV.NORMAL(0,1).
end loop.
exe.

现在,我们可以运行CORRELATIONS命令并将表导出到新数据集(我在此处命名为Corrs)。

DATASET DECLARE Corrs.
CORRELATIONS
  /VARIABLES=X1 to X20
  /MATRIX=OUT('Corrs'). 

不幸的是,SPSS返回完整的矩阵(以及样本大小的其他信息)。我们只能选择我们感兴趣的行(ROWTYPE_列中包含“CORR”的行),然后使用DO REPEAT将矩阵的上半部分或下半部分设置为系统缺失值。 / p>

DATASET ACTIVATE Corrs.
SELECT IF ROWTYPE_ = "CORR".
*Now only making lower half of matrix.
COMPUTE #iter = 0.
DO REPEAT X = X1 TO X20.
  COMPUTE #iter = #iter + 1.
  IF #iter > ($casenum-1) X = $SYSMIS.
END REPEAT.

我将它们设置为系统缺失值,因为下一部分我将使用VARSTOCASES重塑数据。这默认情况下会丢失缺失值,因此我们不会最终拥有冗余关联对。

VARSTOCASES
/MAKE Corr FROM X1 TO X20
/INDEX X2 (Corr)
/DROP ROWTYPE_.
RENAME VARIABLES (VARNAME_ = X1).

现在您拥有相关对列表,只需选择符合条件的相关性即可。

SELECT IF ABS(Corr) >= .5.

可以很容易地将相关对的制作成为MACRO函数以返回对列表。下面是该功能,重新创建此处使用的确切步骤。

DEFINE !CorrPairs (!POSITIONAL !CMDEND)
DATASET DECLARE Corrs.
CORRELATIONS
  /VARIABLES=!1
  /MATRIX=OUT('Corrs'). 
DATASET ACTIVATE Corrs.
SELECT IF ROWTYPE_ = "CORR".
COMPUTE #iter = 0.
DO REPEAT X = !1.
  COMPUTE #iter = #iter + 1.
  IF #iter > ($casenum-1) X = $SYSMIS.
END REPEAT.
VARSTOCASES
/MAKE Corr FROM !1
/INDEX X2 (Corr)
/DROP ROWTYPE_.
RENAME VARIABLES (VARNAME_ = X1).
!ENDDEFINE.

宏只是获取变量列表(在活动数据集中)以获取相关性,并返回名为Corrs的第二个数据集,其中包含相关对和X1和X2列中定义的变量名称。然后在定义上述宏之后,可以通过以下简单地重新创建上述步骤。

!CorrPairs X1 to X20.
SELECT IF ABS(Corr) >= .5.
EXECUTE.

答案 1 :(得分:0)

我的建议是使用OMS将输出中的相关值提取到数据文件中。使用宏仅运行所需的相关性:

DATASET DECLARE  Correlations.
OMS   /SELECT TABLES  /IF COMMANDS=['Correlations'] SUBTYPES=['Correlations']  
 /DESTINATION FORMAT=SAV NUMBERED=TableNumber_    OUTFILE='Correlations' VIEWER=YES.
define runCorrs ()
!do !i1=1 !to 200
!do !i2=!i1 !to 200
!if (!i2<>!i1) !then
corr !concat("W_",!i1) with !concat("W_",!i2).
!ifend
!doend !doend 
!enddefine.
runCorrs.
OMSEND.
datas act Correlations.
select if var2="Pearson Correlation".
VARSTOCASES /make crlVal  from W_2 to W_200/index=withvar(crlVal)
            /drop TableNumber_ Command_ Subtype_ Label_ Var2.

现在你有一个很好的列表,列出了可以使用的所有相关性:

select if crlVal>0.7.
exe.