根据他们的分数总结多个变量分数

Summing up multiple variable scores depending on their score

tl;dr:我需要先将一组变量二分为 0/1,然后对这些值求和。我需要为 14x8 变量执行此操作,因此我正在寻找一种循环执行此操作的方法。

大家好,

我有一个非常具体的问题需要你的帮助:

问题描述: 在我的数据集中,我有 14 组,每组 8 个变量(例如 a1 到 a8、b1 到 b8、c1 到 c8 等),分数范围从 1 到 6。请注意,变量是不连续的,中间有字符串变量它们(我出于不同的目的需要它们)。

我知道要计算每组这些变量的分数(例如 scoreA、scoreB、scoreC)。分数应根据以下规则计算:

scoreA = 0.
If a1 > 1 then increment scoreA by 1.
If a2 > 1 then increment scoreA by 1.
... etc.

示例: 数据集:

1 5 6 3 2 1 1 5

1 1 1 3 4 6 2 3

分数:

5

5

我之前的尝试: 我知道我可以通过首先重新编码变量以将它们二分,然后对这些值求和来完成这项任务。这对我来说有两个很大的缺点:首先,它创建了许多我不需要的新变量。其次,这是一项非常繁琐且重复的任务,因为我需要使用多组变量(具有不同的变量名称)来完成相同的任务。

我用 VECTOR 命令查看了 DO REPEATLOOP,但我似乎没有完全理解它们的工作原理。我无法将我在网上阅读的其他示例的解决方案转移到我的问题中。 我会对只循环遍历一组变量并完成任务的解决方案感到满意,然后我会为我的其他 13 组变量适当地调整语法。希望你能帮帮我。

查看两个解决方案:一个循环遍历每个集合,第二个是循环遍历集合列表的宏:

* creating some sample data.
DATA LIST list/a1 to a8 b1 to b8 c1 to c8 hello1 to hello8.
BEGIN DATA
1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 2 1 1 1 1 1 3 3 3 1 1 1 1 4 4 4 4 
1 1 1 1 2 3 4 5 1 1 1 2 3 4 1 0 0 0 0 0 1 2 1 2 3 2 1 2 3 2 1 6
END DATA.

* solution 1: a loop for each set (example for sets a, b and c).
compute scoreA=0.
compute scoreB=0.
compute scoreC=0.
do repeat 
   a=a1 a2 a3 a4 a5 a6 a7 a8
   /b=b1 b2 b3 b4 b5 b6 b7 b8
   /c=c1 c2 c3 c4 c5 c6 c7 c8./* if variable names are consecutive replace with "a1 to a8" etc'.
 compute scoreA=scoreA+(a>1).
 compute scoreB=scoreB+(b>1).
 compute scoreC=scoreC+(c>1).
end repeat.
execute.

对 14 个不同的集执行此操作并不好玩,因此假设您的集始终命名为 $1 到 $8,您可以使用以下宏:

define DoSets (SetList=!cmdend)
 !do !set !in (!SetList)
   compute !concat("Score_",!set)=0.
   do repeat !set=!concat(!set,"1") !concat(!set,"2") !concat(!set,"3")      !concat(!set,"4") !concat(!set,"5") !concat(!set,"6") !concat(!set,"7")           !concat(!set,"8").
     compute !concat("Score_",!set)=!concat("Score_",!set)+(!set>1).
   end repeat.
 !doend
 execute.
!enddefine.

* now call the macro and list all set names.
DoSets  SetList= a b c hello.

上面的 do repeat 循环工作得很好,但是有很多变量集,创建起来会很乏味。使用 Python 可编程性,可以​​自动生成而不考虑变量顺序。下面的代码假设有无限数量的变量,其名称以小写字母数字形式出现,以 8 个为一组,并生成并运行 do repeat。为简单起见,它为每个输出变量生成一个循环,但这些都将在单个数据传递上执行。如果名称模式不同,如果您说出它是什么,可以调整此代码。

begin program.
import spss, spssaux
vars = sorted(spssaux.VariableDict(pattern="[a-z]\d").variables)

cmd = """compute %(score)s = 0.
do repeat index = %(vlist)s.
compute %(score)s = %(score)s + (index > 1).
end repeat."""

if len(vars) % 8 != 0:
   raise ValueError("Number of input variables not a multiple of 8")

for v in range(0, len(vars),8):
  score =  "score" + vars[v][0]
  vlist = " ".join(vars[v:v+8])
  spss.Submit(cmd % locals())
end program.
execute.