關於心理實驗軟體編程那些事(學習篇)
寫在前面:
最近好幾個人發私信給我詢問學習心理語言學的相關,真的很開心能夠幫到大家。Psycholinguistics 其實在跨學科專業裡面算涉獵比較廣的,而且不同大學資源不同,理論側重角度也不一樣。所以關於擇校這一類的問題,我真的不好回答。
能說的,就是愛丁堡大學心理系真的很棒,和國內多家高校也有合作。而且有固定一些教授對中英雙語研究感興趣。(而且蘇格蘭生活費低,風景美得不行喔~)歡迎大家加入我們~
其實一開始寫這篇文章的初衷是想總結一下這些年學習實驗軟體編程的那些經驗教訓,如果能對初到心理學研究的同學們有幫助就再好不過了。特別是對於非專業編程的同學,你不需要變成大神,掌握幾個基本原則,在學習軟體的過程中會少走很多彎路。
1. 邊學邊用是王道
有人會告訴你實驗編程水很深,但是其實原理一點都不複雜。
編程,尤其是實驗編程,最終目的都是反映你的實驗設計和相關理論研究。不管是E-Prime, Opensesame, Python, Matlab, Psychopy...還有眼動儀器相關軟體
而這些東西,沒有一個課本可以完全教給你,一本軟體編程課本,也只能教會你某個結構要如何設置,不會告訴你這樣的程序是否真的合適你的研究。所以,學習實驗編程的根本還是要多練。根據一個實驗的結構設計為例,找出最合適的測試方法,然後把這個變成可行的實驗程序模板。這可能算是廢話了,但只有自己從零開始一點點建造自己的實驗程序,才能熟練運用各種代碼功能。
或許你第一次只用了文字顯示,第二次要顯示圖片,第三次要放聲音,錄音,第四次測反應時間,準確率,第五次要條件顯示... 不是自己的研究,永遠不會像自己的「寶寶」一樣,了解深刻,而且能把每個細節都事無巨細地想到。
另加一句,如果剛剛起步,那麼從實驗設計階段,就多開發實驗方法的可能性。不要懼怕未知,不會什麼就去學吧!
2. 莫慌!莫慌!
作為實驗編程方面的菜鳥,一開始出現任何問題都是類似五雷轟頂的存在。本來好好的實驗,忽然就彈出了錯誤信息!
「這是哪裡出錯了?是電腦硬體問題還是程序問題?」
「為什麼會實驗會自動終止,為什麼會顯示不出呢?」
「我只有20分鐘!後面還有三個被試啊!!」
因為你不了解錯誤的原理,沒有應急的經驗,自然束手無策,找不到解決方案。而實驗進行往往時間要求很緊,一個因為程序錯誤的延遲可能造成實驗一整天的滯後。
特別想跟大家說:慌張解決不了任何問題。找到最近的技術支持,不管是學校的technician還是有經驗的同事才是正經事。
我們無法完全避免錯誤的出現,但能做的是在預實驗時做盡量多的應急方案,在不同的設備上做更多的測試。在出錯後,儘可能找回未丟失的數據。然後在之後的實驗中做更多的準備和細節測試。
3. 新手和老司機之間是無數個 提示錯誤信息
新手如何變成老司機?冷靜,耐心。煩躁解決不了任何問題,還會大大降低解決問題的效率。編程經驗,靠一個個錯誤信息磨鍊。你不必是編程大神,但在自己的實驗領域,一定要積累足夠的編程經驗來支持你現在和未來的研究實驗設計。
技術方面,首先要說的是:莫慌!然後,反覆看錯誤信息提示。然後,谷歌。各種技術論壇都可以。哪怕搜一下錯誤代碼,網路世界上一定有人和你遇到過同樣的問題。
如果反覆試驗皆無果,可以用排除法。
排除硬體問題:把相同的實驗文件複製到硬體屬性不同的機器上,測試觀察錯誤信息。如果信息一樣,很可能是軟體問題(不限於編程)
排除軟體版本問題:同樣,把實驗文件複製到相同設備,但軟體版本不同的電腦上,觀察錯誤信息。
如果以上兩種方法都無法解決問題,那麼我們可以開始拆實驗了。
把實驗從最簡單的組成部分開始,一點點排除錯誤源頭。
實驗如果有10個組成部分,先新建檔案,測試一個部分,然後一點點加碼。
善用身邊的老手,和雲端大師的實戰經驗。
4. 數據處理
不要忘了實驗的最終目的 —— 收集數據,為理論提供支持。
實驗軟體吐出的數據往往繁瑣不堪。如何在短時間內,用最高效率的方法簡化數據結構,把被試數據合成為R或SPSS等數據處理軟體可以理解的格式?
這個過程需要自己在編程中就構思好:我到底需要什麼數據?反應時間?準確率?眼動位置?
每個trial都會給出什麼數據? 文字還是數字? 要怎麼擺放軟體才看得懂?
不能再強調pre-test(預實驗)的重要性。如果你做的是實驗室環境下的行為實驗,建議多多找真人來測試。這樣一方面會突出一些實驗本身需注意的細節與不足,二是積累一些實驗數據收集過程中的經驗,三也會提供一些可以play around的數據樣本。
編程和數據是絕對不能分開的,實驗編程再複雜,不能生成最有效的數據成為你的理論支持,都是枉然。
5. 積累實驗技能 用處不止編程
學編程這幾年,邏輯思維和抽象思維好像都提高了不少。最重要的可能還是學習解決問題的能力,人也淡定了許多。編程是實驗收集的最重要一環。對於細節的整理,系統性反覆運作的穩定性要求較高。特別是在程序出問題之後把已有數據用處最大化這一環很容易被人忽略。出問題的可能永遠不會為零,所以在出錯之後把影響減到最小,是個需要練習的能力。
正視自己的過失。Learn the lesson, and move on。
==
暫時想到這裡~ 歡迎補充討論。
各種軟體的編程經驗大家都可以分享。學習時需要注意的點,怎麼防止一些常見的坑都可以聊~ ??
順便附上我自己的一個小case study - 程序是 E-Prime 但裡面沒有編程細節,但有很多關於實驗設計的思路,希望對大家有用~
Investigating the Production of L2 Inflectional Morphology Using a Picture Description Paradigm分享一下自己PhD第一組實驗。
這個語言生成實驗的pilot做了三個月,數據分析出來發現大家的response是有問題的。
所以在正式實驗時要調整實驗結構和設計。編程也要隨之改。
語言生成因為數據是音頻,編程需要錄音。用過E-Prime的同學應該知道,錄音需要設置時長。每個trial的時間限制必須一樣。從圖片出現的時間開始計算時間。
【關於錄音】
錄音時長設置一定要和圖片的時長相同。圖片消失,錄音隨之停止。
這兩個時長設置在E Prime裡面是分開的。如果不同會出錯。不管是錄音在圖片消失前就停止 還是錄音時間比圖片顯示時間長。
【關於音頻存儲】
E-Prime的默認存儲文件名是根據顯示順序排列的。Capture Filename默認設置是 @ Auto.如果你的trial order設置是隨機,那麼唯一把音頻放回的實驗的各種condition里的方式就是去看每個被試者的實驗txt文件。耗時耗力,容易出錯。
解決方法:把存儲文件名用[ ]設成list裡面圖片的column name 比如[CUE1]。設置完成,圖片名就是音頻文件名,experimental trial和filler trial不會混淆。如果數據要做聽寫transcription,可以直接刪除所有的filler trial
第二組實驗為自定速度聽力(self-paced listening)測的是聽力反應時間(reaction time)。
E Prime的 RT / RTTime 是從音頻播放就開始計算的,而真正的reaction time要把音頻時長從總反應時間裡剔除。
解決方法:
每段音頻的播放時間要用Praat script提前計算好。
步驟:錄音 - 分段 - 導入Praat - 用calculate segment time的方式生成每一段音頻的長度,計算單位為毫秒。
給每一段音頻文件名新建一個column,然後把音頻實際長度按對應的文件名複製進E Prime的list column裡面。
這樣edat數據導出後可以直接用excel計算出實際反應時間。
推薦閱讀: