【问题标题】:Looping and if statements in SPSSSPSS中的循环和if语句
【发布时间】:2014-01-26 04:03:27
【问题描述】:

我是 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 中执行这些操作。救命!

【问题讨论】:

    标签: variables loops if-statement spss


    【解决方案1】:

    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 将矩阵的上半部分或下半部分设置为系统缺失值。

    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.
    

    【讨论】:

      【解决方案2】:

      我的建议是使用 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-10
        • 1970-01-01
        • 2013-06-09
        • 2013-10-18
        • 2013-02-06
        • 2016-01-12
        • 1970-01-01
        相关资源
        最近更新 更多