我在SPSS中的所有变量的Boxplot

时间:2016-04-26 19:09:15

标签: spss

我想为我的所有变量生成箱图(总共90个)。

这是我将用于一个变量的语法:

GGRAPH   /GRAPHDATASET NAME="graphdataset" VARIABLES=AnScol MISSING=LISTWISE REPORTMISSING=NO   /GRAPHSPEC SOURCE=INLINE. BEGIN GPL   SOURCE: s=userSource(id("graphdataset"))   DATA: AnScol =col(source(s), name("AnScol"))   DATA: id=col(source(s), name("$CASENUM"), unit.category())   COORD: rect(dim(1), transpose())   GUIDE: axis(dim(1), label("AnScol"))  ELEMENT: schema(position(bin.quantile.letter(AnScol)), label(id)) END GPL

如何在不逐个更改每个变量的情况下为所有变量执行此操作?

提前谢谢!

Maxime M.

1 个答案:

答案 0 :(得分:0)

这里我将举几个不同的方式。首先,让我们制作一些假数据 - 十个数字变量和一个表示数据集的Id变量的字符串。

*Make fake data.
MATRIX.
SAVE {UNIFORM(100,10)} /VARS = V1 TO V10 /OUTFILE = *.
END MATRIX.
DATASET NAME Sim.
COMPUTE MyId = $casenum.
FORMATS MyId (F3.0).
ALTER TYPE MyId (A3).

一个简单的解决方案是使用EXAMINE绘制变量方框图。这可以通过传统的对话类型图表获得。

*If the variables all have the same scale.
EXAMINE VARIABLES=V1 TO V10
  /COMPARE VARIABLE
  /PLOT=BOXPLOT
  /STATISTICS=NONE
  /NOTOTAL
  /ID=MyId
  /MISSING=LISTWISE.

enter image description here

这很好用,因为所有的变量都是按照相同的比例构建的。它没有异常值 - 但是如果有的话,它们会在上面的图中用MyId变量标记。

您还可以使用GGRAPH来完成非常相似的事情。我在这里放置了异常值,并且在GGRAPH代码中,您不能轻易地创建异常值变量。

*Make one variable not on the same scale and have outliers.
COMPUTE V1 = V1*100.
IF MyId = "  5" V1 = 250.
EXECUTE.
*Synonymous with GGRAPH - cant label outliers though.
GGRAPH 
  /GRAPHDATASET NAME="graphdataset" VARIABLES=V1 TO V10
   TRANSFORM=VARSTOCASES(SUMMARY="V" INDEX="Vars")
  /GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
  SOURCE: s=userSource(id("graphdataset"))
  DATA: Vars=col(source(s), name("Vars"), unit.category())
  DATA: V=col(source(s), name("V"))
  ELEMENT: schema(position(bin.quantile.letter(Vars*V)))
END GPL.

enter image description here

您可以在此处看到,因为V1现在处于不同的比例,您无法在一个图上有效地显示其他变量。在现实的数据集中,这将是会发生的事情。要做单个图,您可以参考eli-k的建议并使用Python为每个变量提交不同的图。这是一个例子。

*If they don't - and you want different scales, Python programmability can do that.
BEGIN PROGRAM Python.
import spss, string

#get the variable list and the variable type
varList = [(spss.GetVariableName(i),spss.GetVariableType(i)) for i in range(spss.GetVariableCount())]

#make a template to submit boxplot, see https://andrewpwheeler.wordpress.com/2015/02/22/string-substitution-in-python-continued/ 
c = string.Template("""*Boxplots.
GGRAPH
  /GRAPHDATASET NAME="graphdataset" VARIABLES=$var MyId MISSING=LISTWISE REPORTMISSING=NO
  /GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
  SOURCE: s=userSource(id("graphdataset"))
  DATA: V=col(source(s), name("$var"))
  DATA: MyId=col(source(s), name("MyId"), unit.category())
  COORD: rect(dim(1), transpose())
  GUIDE: axis(dim(1), label("$var"))
  ELEMENT: schema(position(bin.quantile.letter(V)), label(MyId))
END GPL.
""")

#loop over the varlist and plot if numeric
for i in varList:
  if i[1] == 0:
    spss.Submit(c.substitute(var=i[0]))
END PROGRAM.

现在你可以看到每个变量都有自己的盒子图,可以快速检查(并标有ID)。

enter image description here enter image description here

等。最后,一种完成类似操作的方法是将所有数值变量重塑为一列,然后使用SPLIT FILE

*Varstocases and split file - need to know which variables are numeric to begin with.
VARSTOCASES /MAKE V FROM V1 TO V10 /INDEX VOrig.
SORT CASES BY VOrig.
SPLIT FILE BY VOrig.
GGRAPH
  /GRAPHDATASET NAME="graphdataset" VARIABLES=V MyId MISSING=LISTWISE REPORTMISSING=NO
  /GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
  SOURCE: s=userSource(id("graphdataset"))
  DATA: V=col(source(s), name("V"))
  DATA: MyId=col(source(s), name("MyId"), unit.category())
  COORD: rect(dim(1), transpose())
  GUIDE: axis(dim(1), label("V"))
  ELEMENT: schema(position(bin.quantile.letter(V)), label(MyId))
END GPL.
SPLIT FILE OFF.