滞后于列/变量SPSS
问题描述:
我想做一些我认为很简单的事情。 我的(模拟)数据如下所示:滞后于列/变量SPSS
data list free/totalscore.1 to totalscore.5.
begin data.
1 2 6 7 10 1 4 9 11 12 0 2 4 6 9
end data.
这些是总分积累在多个试验(在该模拟数据,从1到5)。现在我想知道每个试验中获得的分数。换句话说,我想从n + 1试验中减去n试验中的值。 最简单的语法是这样的:
COMPUTE trialscore.1 = totalscore.2 - totalscore.1.
EXECUTE.
COMPUTE trialscore.2 = totalscore.3 - totalscore.2.
EXECUTE.
COMPUTE trialscore.3 = totalscore.4 - totalscore.3.
EXECUTE.
等等...... 这样的结果是这样的:
但是,当然,这是不可能的,对200多个变量做这个并不有趣。 我试图用向量来写语法和DO REPEAT如下:
COMPUTE #y = 1.
VECTOR totalscore = totalscore.1 to totalscore.5.
DO REPEAT trialscore = trialscore.1 to trialscore.5.
COMPUTE #y = #x + 1.
END REPEAT.
COMPUTE trialscore(#i) = totalscore(#y) - totalscore(#i).
EXECUTE.
但它不工作。 任何帮助表示赞赏。
Ps。我研究过使用LAG,但是它遍历行,而我需要它一次超过1列。
答
我假设respid
是您的原始(唯一)记录标识符。
编辑:
如果没有记录indentifier,你可以很容易地创建一个虚拟的一个:编辑
compute respid=$casenum.
exe.
末
你可以尝试重新对数据进行分析,以便每个得分都是一个独特的记录:
varstocases
/make totalscore from totalscore.1 to totalscore.5
/index=scorenumber
/NULL=keep.
exe.
然后进行排序的情况下,这样的分数按降序排列(为了将包使用lag
功能):
sort cases by respid (a) scorenumber (d).
然后实际做lag
为基础计算
do if respid=lag(respid).
compute trialscore=totalscore-lag(totalscore).
end if.
exe.
在最后,不做重组:
casestovars
/id=respid
/index=scorenumber.
exe.
你应该最终以一个设置totalscore
变量(最后一个将是空的),它将保存你所需要的。
答
可以使用do repeat
这样:
do repeat
before=totalscore.1 to totalscore.4
/after=totalscore.2 to totalscore.5
/diff=trialscore.1 to trialscore.4 .
compute diff=after-before.
end repeat.
嗨horace_vr,非常感谢你的帮助。 我想我需要将“trialscore”与“totalscore”交换以便代码正常工作。 所以基本上,你的建议是转置数据,然后仍然使用滞后。还有其他解决方案吗?我非常好奇索引/脚标如何在SPSS语法中起作用。 另外,如果我没有唯一的记录标识符,该怎么办? – TVV
@TVV:你是正确的交换;我编辑了代码,因此不再需要交换。我还添加了关于如何创建记录标识符的一行。我不知道如何解决它。如果你使用矢量,由于需要总是“查看”前一个变量中的数据,你总会得到一些警告,我认为这不是一种聪明的工作方式(最终你会忽略警告,并在某些时候,你也可能最终出现错误;))。你也可以尝试Python,但我认为这会使事情过于复杂。我的代码很短,你只需要在一个地方进行编辑;) –
@TVV:你是正确的交换;我编辑了代码,因此不再需要交换。我还添加了关于如何创建记录标识符的一行。我不知道如何解决它。如果你使用矢量,由于需要总是“查看”前一个变量中的数据,你总会得到一些警告,我认为这不是一种聪明的工作方式(最终你会忽略警告,并在某些时候,你也可能最终出现错误;))。你也可以尝试Python,但我认为这会使事情过于复杂。我的代码很短,你只需要在一个地方编辑;) –