【问题标题】:Compute variable mean with case removed in SPSS...many times在 SPSS 中删除大小写的情况下计算变量均值...很多次
【发布时间】:2014-03-19 03:49:56
【问题描述】:

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

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

理想情况下,我想做的是创建一个新的 SPSS 数据集,以便这个新数据集中的唯一变量包含这 200 个均值。我相信最好的方法是通过聚合函数。

我遇到的问题是如何删除每个案例,计算平均值,替换案例,在删除另一个案例的情况下再次计算平均值,等等。我可以使用过滤器来做到这一点,但我想自动化它,而不是每次都复制/过去或更改语法。我正在考虑某种重复过滤器,但我对重复和循环命令不太熟悉(但正在处理它......)。

任何有关创建此类过滤器的最佳方法的见解或帮助将不胜感激

【问题讨论】:

  • 这有时被称为jackknifing。在谷歌搜索它出现 Marta García-Granero has an example of this 使用矩阵 - 我认为这也是我的做法。我还想知道是否可以强制以某种方式强制提供回归统计信息 (DFBeta)。

标签: database syntax spss


【解决方案1】:

我的评论是正确的,您可以使用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).

【讨论】:

  • 我看到 Rich Ulrich 和 Bruce Weaver 在 SPSS google group forum 上给出了比这更好的建议。
  • 完美,感谢您的信息。清晰的答案,很棒的语法
【解决方案2】:

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.

【讨论】:

    【解决方案3】:

    我建议一个简单的解决方法:首先将所有 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 种情况,但语法适用于任意数量的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      相关资源
      最近更新 更多