计算变量意味着在SPSS中移除了案例......很多次

时间:2014-03-19 03:49:56

标签: database syntax spss

我希望这是一个简单的问题,但我无法为其创建SPSS语法。

我有一个包含单个变量的数据集,大约有200个案例。我需要计算该变量的平均值,但我需要计算平均值200次,以便在每个案例被移除时计算一次。因此平均值需要计算200次,每次删除一次(然后替换它)并计算缺少该情况的均值。换句话说,我第一次计算平均值时应排除第一种情况(因此分析情况2到200)。我第二次计算平均值时应排除第二种情况但包括第一种情况(因此分析了案例1和3到200)。等等。

理想情况下,我想要创建一个新的SPSS数据集,这样新数据集中唯一的变量就包含这200个方法。我认为最好的方法是通过聚合函数。

我遇到的问题是如何删除每个案例,计算均值,更换案例,再次计算平均值,删除另一个案例,依此类推。我可以使用过滤器执行此操作,但我想自动执行此操作,而不是每次都必须复制/过去或更改语法。我正在考虑某种重复过滤器,但我对重复和循环命令并不是很熟悉(但正在研究它......)。

非常感谢有关创建此类过滤器的最佳方法的任何见解或帮助

3 个答案:

答案 0 :(得分:0)

我的评论中我是正确的,您可以使用REGRESSION过程中提供的删除统计信息来获取所需的信息,而无需自行循环访问数据集。

你要做的是计算你自己的常数值1并强制REGRESSION通过原点(因为SPSS不允许你指定一个空的回归方程)来预测你感兴趣的变量。然后让回归过程保存删除残差。这些删除残差与原始变量之间的差异是删除该观察结果的固定手段。

因此,简而言之,此代码将提供该信息 - 只需将X替换为您感兴趣的变量。

COMPUTE Const = 1.
REGRESSION
  /ORIGIN 
  /DEPENDENT X
  /METHOD=ENTER Const
  /SAVE DRESID (MeanResid).
COMPUTE JackknifeMeanX = X - MeanResid.

完整示例(包含假数据和通过聚合检查)如下:

INPUT PROGRAM.
LOOP Id = 1 TO 10.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
DATASET NAME Sim.
COMPUTE X = RV.NORMAL(10,5).
COMPUTE Const = 1.
FORMATS Id Const (F2.0).
EXECUTE.

*Using deletion residuals in linear regression to calculate Jackknifed mean.
*Here I calculate my own intercept and force through origin.
REGRESSION
  /ORIGIN 
  /DEPENDENT X
  /METHOD=ENTER Const
  /SAVE DRESID (MeanResid).
COMPUTE JackknifeMeanX = X - MeanResid.

*Checking to make sure this agrees with data.
VECTOR XMis(10).
LOOP #i = 1 TO 10.
  IF $casenum <>#i XMis(#i) = X.
END LOOP.
AGGREGATE OUTFILE = * OVERWRITE=YES MODE=ADDVARIABLES
  /BREAK
  /XMis1 TO XMis10=MEAN(Xmis1 TO XMis10).

答案 1 :(得分:0)

SPSS Google Group对你提出的同一个问题进行了一些讨论之后,我写了一个MACRO,根据这个建议来计算基于捷径的方法和方差。

*This functiona calculates the jackknifed mean and variance.
*It also returns the total mean (GrandMean) and total variance (GrandVar).
*All variance calculations use population type (N-1) calculations.

*The parameters it takes are:.
 *Var - Original variable you want calculated.
 *JMean - name of the resulting jackknifed mean (DEFAULT JackMean).
 *VarCalc - flag for if you want the second data pass to calculate Jackknifed variance
            can take either Yes or Y (case does not matter) default is No.
 *JVar - name of the resulting jackknifed variance (DEFAULT JackVar).

DEFINE !JackMeanVar (Var = !TOKENS(1)
                    /JMean = !DEFAULT (JackMean) !TOKENS(1)
                    /VarCalc = !DEFAULT (No) !TOKENS(1)
                    /JVar = !DEFAULT (JackVar) !TOKENS(1) )
*Calculate grand mean and N.
AGGREGATE OUTFILE=* MODE=ADDVARIABLES
  /BREAK
  /GrandSum=SUM(!Var)
  /GrandMean=MEAN(!Var)
  /TotalN=N. 
*Compute Jackknife mean.
COMPUTE !JMean=(GrandSum-!Var)/(TotalN - 1).
*Compute grand contribution to variance.
!IF (!UPCASE(!VarCalc)="YES" !OR !UPCASE(!VarCalc)="Y") !THEN
COMPUTE Vi = !Var**2.
AGGREGATE OUTFILE=* MODE=ADDVARIABLES
  /BREAK
  /GrandVar=SD(!Var)
  /GrandV=SUM(Vi).
*Computing full set variance (population).
COMPUTE GrandVar = GrandVar**2.
*COMPUTE GVar = (GrandV-(GrandSum**2/TotalN))/(TotalN - 1).
*Subtract out local contribution.
COMPUTE !JVar= ((GrandV - Vi) - (GrandSum-!Var)**2/(TotalN -1))/(TotalN - 2).
*Clean Up.
MATCH FILES FILE = * /DROP Vi GrandV.
!IFEND
*Clean Up.
MATCH FILES FILE = * /DROP GrandSum TotalN.
VARIABLE LABELS 
  GrandMean 'Mean for Total Population'
  !JMean 'Mean with this observation left out'
  GrandVar 'Variance (Population) for Total Population'
  !JVar 'Variance (Population) with this observation left out'
  .
!ENDDEFINE.

使用此函数的一个示例 - 以及使用SPSS的聚合函数检查计算的更为迂回的方法如下。

*Test it out.
DATA LIST FREE / X.
BEGIN DATA
1 1 1 2 2 2 3 3 3 4 4 4
END DATA.

!JackMeanVar Var=X JMean = MeanJ VarCalc=Yes JVar = VarJ.
EXECUTE.

*Checking calculations.
VECTOR CheckM(12).
LOOP #i = 1 TO 12.
  IF $casenum<>#i CheckM(#i)=X.
END LOOP.
AGGREGATE
  /OUTFILE=* MODE=ADDVARIABLES OVERWRITE=YES
  /BREAK=
  /CheckM1 TO CheckM12=MEAN(CheckM1 TO CheckM12)
  /CheckV1 TO CheckV12=SD(CheckM1 TO CheckM12).
VECTOR CheckM = CheckM1 TO CheckV12.
VECTOR CheckV = CheckV1 TO CheckV12.
LOOP #i = 1 TO 12.
  DO IF $casenum = #i. 
    COMPUTE MeanCheck = CheckM(#i).
    COMPUTE VarCheck = CheckV(#i)**2.
  END IF.
END LOOP.
MATCH FILES FILE = * /DROP CheckM1 TO CheckV12.
EXECUTE.

答案 2 :(得分:0)

我建议一个简单的解决方法:首先将所有200个案例的均值添加到文件中,然后重新计算每个案例的均值,同时删除该案例的值:

DATA LIST FREE / OrigVar.
BEGIN DATA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
END DATA.

AGGREGATE   /OUTFILE=* MODE=ADDVARIABLES  /BREAK=   /meanAll=MEAN(OrigVar)/Ncases=n.
compute MeanWithoutThisVal= (Ncases * meanAll - OrigVar) / (Ncases - 1).
exe.

此示例仅有30个案例,但语法适用于任意数量的案例。