2017-10-13 186 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.