江蘇省灌南縣疾病預防控制中心(222500) 封永昌 劉阿玲 丁夢秋
多選題(multiple response)數據錄入常用的編碼方法有二分法編碼、分類法編碼和原始編碼,多分類編碼和原始編碼錄入比較簡便,二分法編碼符合統(tǒng)計分析原則[1-2]。目前國內學者對多選題數據轉換與統(tǒng)計分析,多以單個多選題為例,使用excel、SPSS或SAS軟件實現變量編碼轉換和統(tǒng)計分析[1-5],對于問卷設計為多個多選題的情況并使用R軟件實現的討論較少。R作為一款功能卓越的免費軟件,近年來在衛(wèi)生領域的應用明顯增多[6]。本文主要介紹問卷中一組多個多選題的判分以及原始編碼數據轉換為二分法編碼的R軟件實現。
設計思想參照文獻[1-2],此處不贅述。
1.實例:全國居民健康素養(yǎng)監(jiān)測調查問卷(2016年江蘇版),該問卷的主體有判斷題、單選題、多選題、情景題等4模塊共56題,其中多選題模塊有16題(未包含情景題模塊多選題),每題配置5個選項,作答的所選項按其編號從小到大順序形成數字字符串錄入到Epidata數據文件中。問卷整理需要根據正確答案對每份調查問卷的每一題進行判分,再根據總分和各維度得分情況判定是否具備健康素養(yǎng);現為進一步挖掘問卷更多信息,對多選題選項按二分法編碼[6-7]。16個多選題的標準答案依次為{123,14,123,123,34,1234,123,123,1234,1234,13,23,23,124,124,23},使用軟件R i386 3.3.2 for Windows和R Studio V1.0.44 (下載地址https://cran.r-project.org 和https://www.rstudio.com)。
2.數據導入:原始數據在EpiData軟件下輸出為文本文件sy.txt,用R軟件的read.csv2()函數導入,在R中建立數據表對象sy,sy中16個多選題的變量名為C01~C16,語句為(#號后為注釋內容,下同):
sy<-read.csv2("sy.txt",header = TRUE,sep = ";")
#此處sy.txt文件在R的當前工作路徑。
3.多選題判分:根據正確答案構建向量XC,對每題判分,“完全正確”賦2分,“錯誤”賦0分;在sy中建立后綴為-s的16個新變量即C01s、C02s、C03s、……、C16s,存放各題的賦分值。語句為:
XC<-c("123","14","123","123","34",
"1234","123","123","1234","1234","13",
"23","23","124","124","23")
#多選題判分標準答案。
ic<-c(paste0("0",1:9),10:16)
#建立序號向量01~16
t1<-paste0("sy$C",ic,"s<-ifelse((sy$C",ic,"==",XC,"),2,0)")
eval(parse(text=t1))
#粘合的判分字符串t1轉化為表達式并求解。
4.各題所選項轉換為二分法編碼,生成后綴為v1~v5的新變量,即C01v1、C01v2、…、C01v5,C02v1、C02v2、…、C02v5,…、C16v5等計80個新變量,賦值0或1。語句為:
t2<-paste0("sy$C",ic,"<-as.character(sy$C",ic,")");#各題所選項數值轉換為字符型
eval(parse(text=t2))
for (i in 1:5) {
t3<-paste0("sy$C",ic,"v",i,"<-as.numeric(regexpr(",i,",sy$C",ic,")>0)")
eval(parse(text=t3))
}
5.假如某一多選題選項數目超過9個,在錄入時可用單字母代替>9的選項編碼。例如,假設問卷中某多選題的題號為C18,選項有12個,1~9的選項以所選項數字直接錄入,>9的選項以單字母a、b、c錄入代替其原編號10、11、12,錄入后轉換為二分法編碼,生成C18m1至C18mc共12個新變量,賦值0或1。不訪虛構前5例的所選項編碼為“321c6ba”、“5428c”、“21a”、“123”、“256abc”,以便與命令語句及其后的注釋“#虛構的所選項編碼”對應。語句可用:
m<-c(1:9,"a","b","c")
sy$C18<-c ("321c6ba","5428c","21a",
"123","256abc")
#虛構的所選項編碼
for (j in 1:length(m)) {
t5<-paste0("sy$C18m",m[j],"<-as.numeric(regexpr(?,m[j],?,sy$C18)>0)")
eval(parse(text=t5))
}
6.假如發(fā)現多選題的所選項編碼沒有按從小到大順序錄入,例如錄入編碼為“4231”,需要調整為“1234”方可在判分時不出錯,轉換時可建立新變量C01a~C16a便于對照。語句為:
for (b in 1:nrow(sy)) {
cl<-paste0("sy$C",ic,"a[",b,"]<-")
cr<-paste0("paste0(sort(strsplit(sy$C",ic,"[",b,"],")[[1]]),collapse=")")
t4<-paste0(cl,cr)
eval(parse(text=t4))
}
調查問卷中設計多選題是為了最大限度采集研究所需要的信息,研究多選題編碼錄入與轉換是為了最大可能提高錄入的效率和準確性,盡可能對數據進行深入的分析和挖掘。采用excel、SPSS、SAS等軟件對調查問卷中一組多個多選題進行判分和編碼轉換仍比較繁瑣,且存在商業(yè)軟件的使用版權問題。本文使用完全開源免費的R軟件,以健康素養(yǎng)監(jiān)測調查問卷中多選題為例,提供了一組多選題的判分及選項按二分法進行編碼轉換的運行語句,原理與方法簡單,具有操作上的可復制性和功能上的可擴展性,在保留原始編碼法錄入優(yōu)點的基礎上,為研究者對多選題數據進行深度挖掘提供了方便[5-7]。
R軟件處理數據的強大優(yōu)勢在于向量化操作。本文在根據多選題標準答案進行判分和所選項原始編碼轉換為二分法編碼時,使用ifelse()、regexpr()、strsplit()、sort()、paste0()等函數[8-9]與for循環(huán),根據所選項編碼中是否包含多選題的某選項編號,返回給該選項的二分法變量值1或0。本文中R語句的巧妙在于,以向量化操作為基礎,利用paste0()函數拼接出執(zhí)行語句的文本字符串,用parse() 函數將字符串轉化為一組表達式,最后用 eval() 函數對表達式求解,使語句顯得十分簡潔,又能提高運行速度[9]。多選題選項個數>9的情況,本文建議將>9的選項編碼以單字母(即a、b、c、……)代替其原編碼(即10、11、12、……)進行錄入,在R軟件下仍可輕松進行二分法編碼轉換。需要注意的是,若問卷中設計的每個多選題選項數目不一致(如有的是8個選項,有的是5個選項,有的是3個選項),可按最多的選項數目定義循環(huán)次數變量,語句執(zhí)行后僅在數據框對象中增加一些無意義的多余新變量,不影響數據的進一步分析,或對多余新變量進行刪除處理(如刪除數據表sy中變量C06v7的語句可用“sy$ C06v7<-NULL”)。 期望本文能為居民健康素養(yǎng)監(jiān)測以及其他社會調查領域的研究者在數據整理時提供參考。