2017-10-13 188 views
2

我想做一些我认为很简单的事情。 我的(模拟)数据如下所示:滞后于列/变量SPSS

enter image description here

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. 

等等...... 这样的结果是这样的:

enter image description here

但是,当然,这是不可能的,对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列。

回答

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变量(最后一个将是空的),它将保存你所需要的。

+0

嗨horace_vr,非常感谢你的帮助。 我想我需要将“trialscore”与“totalscore”交换以便代码正常工作。 所以基本上,你的建议是转置数据,然后仍然使用滞后。还有其他解决方案吗?我非常好奇索引/脚标如何在SPSS语法中起作用。 另外,如果我没有唯一的记录标识符,该怎么办? – TVV

+0

@TVV:你是正确的交换;我编辑了代码,因此不再需要交换。我还添加了关于如何创建记录标识符的一行。我不知道如何解决它。如果你使用矢量,由于需要总是“查看”前一个变量中的数据,你总会得到一些警告,我认为这不是一种聪明的工作方式(最终你会忽略警告,并在某些时候,你也可能最终出现错误;))。你也可以尝试Python,但我认为这会使事情过于复杂。我的代码很短,你只需要在一个地方进行编辑;) –

+0

@TVV:你是正确的交换;我编辑了代码,因此不再需要交换。我还添加了关于如何创建记录标识符的一行。我不知道如何解决它。如果你使用矢量,由于需要总是“查看”前一个变量中的数据,你总会得到一些警告,我认为这不是一种聪明的工作方式(最终你会忽略警告,并在某些时候,你也可能最终出现错误;))。你也可以尝试Python,但我认为这会使事情过于复杂。我的代码很短,你只需要在一个地方编辑;) –

0

可以使用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.