张彬艳 米白冰 王予童 刘卉萌 党少农 颜 虹
西安交通大学医学部公共卫生学院流行病与卫生统计学系, 710061 陕西 西安
膳食调查是营养流行病学研究领域的重要部分,目前半定量、定量的食物频率问卷(food frequency questionnaire,FFQ)在评价营养与慢性病关系的研究中被广泛使用[1-4]。其中半定量FFQ(SQFFQ)不仅调查了研究对象的食物摄入频率,还调查了食物摄入量,其结合了定性与定量膳食调查的优点,在我国营养学界已逐渐得到重视,且受到日益广泛的应用[5]。但其应用也面临一些问题,特别是大规模流行病学调查过程中,SQFFQ数据的高效处理和计算已成为实际研究中亟需解决的问题。目前,SQFFQ中各类营养素摄入量的计算方法主要是基于营养计算器[6]、Excel、SPSS软件实现的,其原理仍为条目乘积结果的累加计算[7-9],具体过程繁琐、工作量较大,在大规模人群调查中应用多有不便。矩阵乘法运算可认为是相乘矩阵各元素的乘积累加[10],因此,合理应用矩阵乘法计算膳食成分可有效提升大规模膳食数据分析的效率。本研究结合实际营养流行病学膳食调查,运用SAS交互式矩阵语言演示如何计算SQFFQ营养素摄入量,旨在为膳食营养领域研究者提供实际应用的参考依据。
膳食数据库来源于国家自然科学基金重点项目“围孕期微营养素干预对先天性心脏病发生的一级预防作用及其机制”中的子课题“陕西省出生缺陷现况及其危险因素调查”项目的数据,根据城乡比例并考虑人口密集度和生育水平采用分层多阶段随机抽样方法进行抽样,于陕西省内随机抽取10个城区和20个县;在抽取的样本区、县中分别随机抽取3个街道办事处和6个乡镇后,每个街道办事处、乡镇分别随机抽取6个社区和村,每个社区与村分别随机调查60名和30名符合条件的育龄妇女[11],采用SQFFQ调查育龄妇女孕期膳食情况。采用EpiData 3.1软件进行数据双录入。为测试计算性能,采用PROC SURVEYSELECT程序中的简单随机抽样方法随机选取其中3 000份SQFFQ作为训练集并建立膳食数据库[12-13]。研究通过了西安交通大学医学伦理审查委员会批准(审批文号:2012008)。
1.1.1 SQFFQ数据特点
SQFFQ可以获得育龄妇女孕期长期的膳食摄入,从而估计孕期膳食摄入的平均情况。该方法改编自已有的FFQ法,其信效度已经过验证并在中国部分农村地区孕妇中应用[14]。该问卷共收集了102种食物的使用频率及摄入量,食物种类包括谷类及其制品,薯类及其制品,豆类及其制品,蔬菜及其制品,坚果,乳类及其制品,蛋类,水果及其制品,菌澡类,肉类及其制品,鱼虾蟹贝类,小吃、甜饼类,速食和饮料。针对上述食物,详细询问其摄入频率并赋值,包括:(1)几乎不吃(赋值为1);(2)<1次/月(赋值为2);(3)1~3次/月(赋值为3);(4)1次/周(赋值为4);(5)2~4次/周(赋值为5);(6)5~6次/周(赋值为6);(7)1次/d(赋值为7);(8)≥2次/d(赋值为8)。具体计算食物成分时,将几乎不吃、<1次/月定义为0.0次/周;1~3次/月定义为0.5次/周;2~4次/周定义为3.0次/周;5~6次/周定义为5.5次/周;1次/d定义为7.0次/周;≥2次/d定义为14.0次/周。将食物摄入频率按前述标准进行转换获得食物每周摄入频率后,再将次数除以7,获得食物每日摄入频率(FRi)。随后,将问卷中每日摄入量按一定标准转换为具体食物每次摄入量(WTi)。见表1。
表1 研究对象膳食数据库示例
1.1.2 食物成分表数据库
以《中国食物成分表(2002版)》及2009年更新版本,《中国食物成分表(2004版)》为准[15-16],采用EpiData 3.1软件进行双录入,结合本研究SQFFQ收集的102种食物及25项营养素成分构建食物成分表数据库。25项营养成分分别为能量、蛋白质、脂肪、碳水化合物、总膳食纤维、可溶性膳食纤维、不可溶性膳食纤维、胆固醇、灰分、维生素A、胡萝卜素、硫胺素、核黄素、维生素B6、维生素B12、叶酸、尼克酸、维生素C、总维生素E、α-生育酚当量、钙、磷、钠、镁和铁。见表2。
表2 食物成分表数据库示例
1.2.1 矩阵乘法
矩阵乘法是矩阵的基本运算之一,其原理即当左边矩阵A的列数等于右边矩阵B的行数时,A与B才能相乘(A左乘B,或B右乘A),即AB才有意义;若A=(aij)m×s矩阵,B=(bij)s×n矩阵,则矩阵A与矩阵B的乘积C=AB矩阵,即C=(cij)m×n。C元素第i行第j列元素cij为A的第i行元素与B的第j列元素对应相乘取乘积之和。
1.2.2 SAS IML矩阵功能模块的实现
SAS统计分析软件包中的IML模块[17]是一种在动态和交互式环境下实现的强大而灵活的过程语言,简称交互式矩阵语言,其基本数据对象是矩阵,所有运算和操作都是基于矩阵。SAS/IML中的矩阵和DATA步及SAS环境中的数据集可以双向流动,数据集可以读入IML中形成矩阵,进入IML环境的方法是执行语句PROC IML,退出语句为QUIT。IML中的矩阵可以读出为SAS数据集,这种交互式操作极大方便IML编程的对象,其基本操作程序如下:
(1)打开目标SAS数据集:使用use语句打开SAS数据集,可采用read对数据集实施读出操作,读出数据至IML中。
(2)使用SAS数据集创建矩阵:使用带有var和into从句的read语句,将SAS数据集传递到矩阵里,例如:read all var {pc}into pc;即将数据集中的变量pc读取出来形成一个矩阵pc;若A、B为矩阵,C为向量,A[i,j]表示矩阵A的第i行,第j列元素,A[i,]表示矩阵A的第i行所有元素,A[,j]表示矩阵A的第j列所有元素;A||B表示矩阵的合并,“||”表示将2个矩阵水平连接,即矩阵A中的每行元素分别连接在矩阵B中相应的右边,结果矩阵的行数与A,B相同;A[c1:c2,d1:d2]指矩阵A的第c1行到c2行和第d1列d2列的所有元素;矩阵的算术运算,A×B表示矩阵A乘矩阵B,A#C表示矩阵A中每一行或每一列的元素与向量C中元素相乘(向量C可以是行向量也可以是列向量)。
(3)采用create语句创建SAS数据集: 格式为create SAS数据集名 from 源数据名[Colname=column-name Rowname=row-name];其功能为创建SAS数据集并打开,供读入或者写出,用append语句将矩阵中的数据读入新建的SAS数据,否则数据集中没有观测值。
1.2.3 膳食数据库与食物成分表数据库的运算
首先,于膳食数据库中,建立3 000例(行)研究对象的102种(列)食物,研究对象每天每种食物摄入量的矩阵FW=FR×WT,采用公式如下:
FWi=FRi×WTi(i=1,2,3…,102)。
其次,于食物成分表数据库中,建立102种(行)食物,25种(列)营养素的矩阵FC,对每一例被调查者,其某一营养素总摄入量的计算公式如下:
某一营养素每日总摄入量PF=FR1×WT1×食物1中该营养素含量+FR2×WT2×食物2中该营养素含量+ … +FR102×WT102×食物102中该营养素含量。
最后,运用矩阵乘法运算原理,计算3 000例研究对象的25种营养素摄入量,计算公式:
PF=FW×FC。
若A(FW)为m×s矩阵,B(FC)为s×n矩阵,则他们的矩阵乘积AB(FW×FC)会是一个m×n的矩阵C(PF)。C的元素等于A的第i行每个元素与B的第j列对应元素的乘积之和,即C(i,j)元素为:
(i=1,2,…,m;j=1,2,…,n)
首先,采用SAS 9.4 软件PROC SURVEYSELECT程序中的简单随机抽样方法随机选取调查数据中3 000份半定量膳食频率问卷作为训练集;其次运用SAS数组Array中的Do Loop语句计算研究对象102种食物每日摄入量;最后,利用交互式矩阵语言PROC IML编程演示计算研究对象半定量食物频率问卷中25种营养素摄入量。
首先,导入膳食数据库;其次,运用SAS统计软件包DATA步数组Array中的Do Loop语句。计算食物每天摄入量程序如下:
PROC IMPORT OUT= WORK.SQFFQ
DATAFILE= "E:DietarydataSQFFQ.sav"
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
RUN;
DATA SQFFQ;
SET SQFFQ;
array freq(102)freq1-freq102;
array weight(102)weight1-weight102;
array food(102)food1-food102;
do i=1 to 102;
food(i)=freq(i)*weight(i);
end;
RUN;
运用SAS程序PROC IML。首先,导入食物成分数据库;其次,计算每位研究对象的营养素摄入量。程序如下:
PROC IMPORT OUT= WORK.FOOD
DATAFILE= "E:DietarydataFOOD.sav"
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
RUN;
PROC IML;
varnames1="food1":"food102";/*设定食物名称*/
varnames2={"PC" "ENERGY" "PROTEIN""FAT" "CHO" "DIETFIBT" "DIETFIBS" "DIETFIBI" "CHOLESTE" "ASH" "VITA" "CAROTEN" "THIAMIN" "RIBOFLAV" "VITB6" "VITB12" "FOLATE" "NIACIN" "VITC" "VITE" "AVITE" "CA" "P" "NA" "MG" "FE" };/*设定PC及营养素名称,分别为,能量;蛋白质;脂肪;碳水化合物;总膳食纤维;可溶性膳食纤维;不可溶性膳食纤维;胆固醇;灰分;维生素A;胡萝卜素;硫胺素;核黄素;维生素B6;维生素B12;叶酸;尼克酸;维生素C;总维生素E;α-生育酚当量;钙;磷;钠;镁;铁*/
use sqffq; read all var varnames1 into food; read all var{pc}into pc; close sqffq;/*生成食物摄入量矩阵*/
use food; read all var _NUM_ into component; close food;/*生成component矩阵*/
edible=component[,1];/*生成可食部向量*/
component_1=component[,2:26];/*生成食物成分矩阵*/
food_1 = food/100;/*将食物摄入量除以100,得到以100 g为单位的食物摄入量矩阵*/
component_2 = edible#component_1; component_3=component_2/100;/*可食部与食物成分表的相乘矩阵*/
nutrient=food_1*component_3;/*食物摄入量与食物成分表的矩阵乘法,即每位研究对象的营养素摄入量*/
final=pc||nutrient;/*添加PC号*/
print final;
create nutrients from final[colname=varnames2];
append from final;
QUIT;
SAS程序运行后,获得25种营养素摄入数据集且自动输出,研究人员可以根据研究目的进行后续统计分析。见表3。
表3 调查对象营养素摄入量结果示例
同时,在SAS日志输出窗口看到PROC IML过程执行时间为0.59 s。结果显示,应用SAS交互式矩阵语言PROC IML计算半定量食物频率问卷营养素摄入量快速高效,结果准确可靠,值得在相关研究中推广使用。见图1。
图1 SAS中PROC IML运行日志
针对不同软件在大规模流行病学膳食调查研究中应用的特性给出0~2分的评价得分,然后统计出综合评价得分;分值越高,代表软件在处理大规模膳食调查数据的优势越强。结果提示,相比营养计算器、Excel、SPSS,SAS交互式矩阵语言计算SQFFQ营养素摄入量应用性较好。见表4。
表4 营养计算器、Excel、SPSS及SAS软件处理大规模膳食调查数据操作评价
本研究运用SAS统计软件包IML功能演示计算SQFFQ营养素摄入量,为SQFFQ在营养流行病学中的应用提供参考依据,有助于提高膳食数据分析的准确性和高效性。
相比24 h膳食回顾法、膳食日记法、膳食史法等能反映短期的膳食摄入的工具/方法,膳食史法侧重于测量长期食物摄入种类和摄入量,其可反映研究对象相当长时间的膳食摄入平均情况,且既往研究报道表明饮食习惯在一定时间内改变可能不大[18],进而可评估一定时间段内膳食营养素摄入平均情况与疾病的关系,比短期的膳食评价摄入更有意义,但其问卷食物种类较多,需要整理分析的变量也相应较多,统计分析工作较为繁琐。目前使用的营养计算器、Excel、SPSS可以实现其数据整理及统计分析工作,然而运用SAS中PROC IML功能对膳食调查数据处理报道较少。因此,本研究利用“陕西省出生缺陷现况及其危险因素调查”项目的数据,实例演示具体研究中如何利用SAS交互式矩阵语言计算SQFFQ营养素摄入量,为膳食营养领域提供实际操作参考。
相较营养计算器、Excel、SPSS软件,SAS统计软件包交互式矩阵语言PROC IML提供功能强大的面向矩阵运算的编程语言,其基本数据元素是矩阵,需0.59 s即可完成本研究膳食数据计算,其操作方式和数据准备程序化,且运算速度较快,获得结果准确。其次,在后续类似膳食数据分析时,只需导入研究项目膳食数据库,更新并导入食物成分表数据库,自定义相关变量,即可直接调用程序,复用性高,针对计算SQFFQ营养素摄入量,研究人员可用较少的语句执行复杂的计算过程,具有一定的实用性。应用SAS交互式矩阵语言计算SQFFQ营养素摄入量,适用于医学工作者,不仅可以保证数据处理分析的准确性,而且可以提高研究工作的效率。
综上所述,SAS交互式矩阵语言PROC IML编程在计算半定量食物频率问卷营养素摄入量时,其操作简便,易于实现,具有一定实际应用性,值得在相关研究中推广。