必备软件:Matlab
使用matlab基于DOMFlour工具箱分析样品的三维荧光光谱数据。
常用的几种去瑞丽和拉曼散射的方法主要有直接裁剪、三角插值和样条插值,初始的几天利用我们自己的140个样品的三维荧光光谱比较了这三种方法去散射后的结果,其中直接裁剪和样条插值都只能分出3组分,而三角插值可以分出5组分,初步认定三角插值的结果更为可靠,事实上现在很多硕士论文都在使用三角插值,所引,本文中所使用的DOMflour工具箱经本人修改后主要是使用三角插值方法进行分析,当然工具箱中也内置了直接裁剪和样条插值的matlab函数,但本篇不进行相关的介绍。
DOMflour工具箱源代码链接:Algorithms – Chemometrics Research (ucphchemometrics.com)
本篇适用于DOMflour初入门的小白,可以快速实现数据分析和导出。如需系统学习,建议通过以下链接学习:三维荧光平行因子分析之DOMFluor工具箱使用经验分享 - 知乎 (zhihu.com)
本人也是基于上述链接博主的分享,学习了近半月才基本学会,包括修改代码定义函数等,如不想学代码,只想分析三维荧光光谱数据可继续阅读本篇。
本篇主要介绍三角插值方法的三维荧光光谱-平行因子分析,因本人修改了原工具箱中的函数,所以本文中介绍的方法仅适用于本人编写的DOMflour工具箱,如有需要可联系本人(非无偿)。
详细步骤如下:
将每一隔步骤下的代码复制粘贴到matlab的命令行窗口,按回车即可运行代码。
1)、输入样品数据文件所在文件夹路径及几个函数变量
FilePath = 'C:\Users\Desktop\测试\测试文件夹'; %根据自己保存的位置更改
WaterPath = 'C:\Users\Desktop\测试\水'; %同上
suffix = 'TXT'; %注意第3步中导出数据文件为后缀为TXT,如为txt则改成txt即可
Path = 'C:\Users\Desktop\测试'; %此步为选择matlab处理后的数据文件夹,例如此处选择Desktop则后续所有保存的文件都会在桌面,同理改成其它的则都会在相应的文件夹下。
2)、处理原始数据文件,即前面第1、2、3步骤中导出的txt文件。
[PreSampleData,PreWaterData]=PreOriginalData(FilePath,WaterPath,suffix);
AutoSaveData(PreSampleData,Path,1);
AutoSaveData(PreWaterData,Path,2); %注意,1和2是决定保存在什么路径下的重要参数,不可修改,1为原始样品数据保存路径,2为水空白原始数据保存路径
%运行此步骤后,会在前面所选的Path自动生从样品和水空白的原始数据文件夹,其下包含之前导出的所有txt所对应的三维矩阵数据,第一行为Ex,第一列为Em。此处,建议核对一下几个样品和水空白的数据是否和原来导出的txt中的数据一致。运行完后在matlab的工作区会显示SampleData,WaterData的cell文件。
[SampleData,PointsData] = RemovelWater(PreSampleData,PreWaterData,350,[380 420]);
AutoSaveData(SampleData,Path,3); %同之前,参数为3会在步骤1)中设置Path路径下生成扣除水空白的数据文件夹和拉曼单位数据文件夹
%通常拉曼积分是在Ex=350nm,Em在360到420之间的积分值,故此处350为拉曼积分所用的Ex(若原始数据文件中没有350nm,可以选取350nm附近的如348或352nm,又或者取二者均值,此步不建议修改,除非原始数据中实在没有350nm);[380 420]是拉曼积分所用Em范围,建议自行从水空白数据中找到Ex350nm,Em在360到420nm区间内的峰起始点和终点,通常峰起始选择从360到390之间的最小值,峰终止选择400-420之间的最小值,或可自行选择至425也行。运行此步骤后会在前面设置的Path文件夹下生成扣除了水空白的文件夹和转化为拉曼单位后的数据文件夹,其下包含之前导出的所有txt所对应的三维矩阵数据,第一行为Ex,第一列为Em。此处,建议核对一下几个样品和水空白的数据差值是否和此处生成的数据一致,通常是一致的。此外在matlab工作区会生成一个PointsData的cell数据,可以双击进去查看第一列为样品号,第二列为选定波长范围内的积分,用于将数据转化为拉曼单位,可自行选取空白到Origin里进行积分然后比较是否一致,代码写的时候经测试是一致的。
%如果样品数据文件夹和水空白数据文件夹中的文件名不是一一对应的,则会输出"样品号 0或2以上等 请检查是否一一对应",0表示缺少水空白,2及以上表示水空白相同文件名存在2个及以上。为了不影响后续的分析,此处必须保证样品和水空白一一对应,文件数目上样品数必须大于或等于水空白文件数目。
[DelaunayData] = AutoDelaunay(SampleData,[1000 16;12 8;16 16;0 0],[240 2 440],[250 5 680]);
AutoSaveData(DelaunayData,Path,4); %同之前,参数为4会在步骤1)中设置Path路径下生成三角插值后的数据文件夹
%运行此行代码,会自动对每个样品进行去瑞丽和拉曼散射并进行三角插值,注意,如果样品波长不是Ex在240到440\间隔2,Em在250到680\间隔5nm,那么会自动使用三角插值将样品数据插值为Ex在240到440\间隔2,Em在250到680\间隔5nm的矩阵,如果前面步骤中输入样品有起始Ex波长小于240的则会截取原数据中Ex大于等于240的数据,其它波长参数同理。其中[1000 16;12 8;16 16;0 0]是瑞丽散射和拉曼散射范围,1000 16为一阶瑞丽,12 8为一阶拉曼,16 16为二阶瑞丽,0 0为二阶拉曼,其中数值根据实际情况进行修改。[240 2 440]中240和440是输出样品数据矩阵的Ex范围,2为间隔2nm一个数据;[250 5 680]中250和680是输出样品数据矩阵的Em范围,5为间隔5nm一个数据;这两个也可以按实际情况进行修改。
[OriginalData] = ParafacDataPre(DelaunayData);
%平行因子分析数据整合
AutoSaveData(OriginalData,Path,5); %计算FI、HIX、BIX、β:α新鲜度指标、Fn280、Fn355 等6个指标,执行此函数会自动在Path路径下创建文件 '荧光指标.xlsx'
%常规矫正 (和非负校正选其一,通常选非负校正)
[Test1]=OutlierTest(OriginalData,1,1,2,'No','No');
PlotLL(Test1,2);
[Test1]=OutlierTest(OriginalData,1,1,3,'No','No');
PlotLL(Test1,3);
[Test1]=OutlierTest(OriginalData,1,1,4,'No','No');
PlotLL(Test1,4);
[Test1]=OutlierTest(OriginalData,1,1,5,'No','No');
PlotLL(Test1,5);
[Test1]=OutlierTest(OriginalData,1,1,6,'No','No');
PlotLL(Test1,6);
[Test1]=OutlierTest(OriginalData,1,1,7,'No','No');
PlotLL(Test1,7);
%非负矫正 (和常规校正选其一,通常选非负校正)
[Test2]=OutlierTest(OriginalData,1,1,2,'Yes','No');
PlotLL(Test2,2);
[Test2]=OutlierTest(OriginalData,1,1,3,'Yes','No');
PlotLL(Test2,3);
[Test2]=OutlierTest(OriginalData,1,1,4,'Yes','No');
PlotLL(Test2,4);
[Test2]=OutlierTest(OriginalData,1,1,5,'Yes','No');
PlotLL(Test2,5);
[Test2]=OutlierTest(OriginalData,1,1,6,'Yes','No');
PlotLL(Test2,6);
[Test2]=OutlierTest(OriginalData,1,1,7,'Yes','No');
PlotLL(Test2,7);
[Test2]=OutlierTest(OriginalData,1,1,8,'Yes','No');
PlotLL(Test2,8);
%去除异常值
---------------------------------------------------------------------------------------
[Test3]=RemoveOutliers(OriginData,[1 25 26 51],[],[]);
%注意,假设前面矫正后发现1 25 26 51等样品的Leverage偏高,可以考虑去除,但注意此处1 25 26 并非样品编号,若要找出实际样品号应该在matlab工作区的OriginalData中的SampleName中找到对应行数所对应的样品编号。个人建议不执行去除异常点,去除一个异常点后再校正又会出现新的异常点,可以执行去除异常点看看,若没有新的异常点出现可以考虑去除异常点。
%如果执行了去除异常点,此处下一步的Test2需要相应的改为Test3
Test2.Ex_SquareErr = zeros(size(Test2.Ex,1),8)
Test2.Em_SquareErr = zeros(size(Test2.Em,1),8) %这两步创建Ex和Em平方误差矩阵,其中'102'是Ex和Em波长个数,'8'为最大组分数加一;用于后续绘图
Test2 = CompareSpecSSE(Test2,2,3,4); %这几步可以分别运行,比较2 3 4组分的残差值,残差值越小越好,但需要注意如果残差值变化不大则说明没必要多分组分
Test2 =CompareSpecSSE(Test2,3,4,5); %这几步可以分别运行,比较3 4 5组分的残差值,残差值越小越好,但需要注意如果残差值变化不大则说明没必要多分组分
Test2 =CompareSpecSSE(Test2,4,5,6); %这几步可以分别运行,比较4 5 6组分的残差值,残差值越小越好,但需要注意如果残差值变化不大则说明没必要多分组分
Test2 =CompareSpecSSE(Test2,5,6,7); %这几步可以分别运行,比较5 6 7组分的残差值,残差值越小越好,但需要注意如果残差值变化不大则说明没必要多分组分
AutoSaveData(Test2,Path,6); %导出平方误差数据
%拆办分析验证
%分割数据
[AnalysisData]=SplitData(Test2)
%拆办分析
[AnalysisData]=SplitHalfAnalysis(AnalysisData,(3:7),'MyData.mat')
%拆办分析验证 3 4 5 6 7 是组分数
SplitHalfValidation(AnalysisData,'1-2',3);
SplitHalfValidation(AnalysisData,'3-4',3);
SplitHalfValidation(AnalysisData,'1-2',4);
SplitHalfValidation(AnalysisData,'3-4',4);
SplitHalfValidation(AnalysisData,'1-2',5);
SplitHalfValidation(AnalysisData,'3-4',5);
SplitHalfValidation(AnalysisData,'1-2',6);
SplitHalfValidation(AnalysisData,'3-4',6);
SplitHalfValidation(AnalysisData,'1-2',7);
SplitHalfValidation(AnalysisData,'3-4',7);
%上述运行完后再matlab的命令行窗口会显示拆板验证的结果,例如 7 Component Model, Split=1-2 Result= Not Validated 表示7组分在1-2的对半分析中未验证通过。7 Component Model, Split=3-4 Result= Split Half Comparison,说明7组分在3-4的对半分析中验证通过。当1-2和3-4均未验证通过可能说明分成当前数量的组分是不可靠的.同理其它组分数也是这样,当1-2和3-4均验证通过说明当前组分数合理。
AutoSaveData(AnalysisData,Path,7,4); % 7是保存文件确认参数,不可更改;4为想要导出的组分数
%导出拆半分析验证结果数据,此处导出数据根据峰位置自行判断组分,同一个峰在两个拆半结果中可能分别被命名为C1和C2,但根据峰的Ex和Em载荷是可以判断为同一组分。导出的数据中A和B是split1-2的结果,C和D是3-4的结果
%随机初始化
[AnalysisData3]=RandInitAnal(AnalysisData,3,10) %3为确定的组分数,此处输出参数为 AnalysisData3表示为3组分随机初始化后的结果,若组分数确定为4则将AnalysisData3改为AnalysisData4,并且等号后面括号中的3也改为4,组分为5以此类推
%比对结果,1和3,2和4看是否一致 3为确定的组分数,AnalysisData3表示为3组分随机初始化后的结果,若组分数确定为4则将第三和第四行的AnalysisData3改为AnalysisData4,并且等号后面括号中的3也改为4,组分为5以此类推
SplitHalfValidation(AnalysisData,'1-2',3);
SplitHalfValidation(AnalysisData,'3-4',3);
SplitHalfValidation(AnalysisData3,'1-2',3)
SplitHalfValidation(AnalysisData3,'3-4',3)
%创建组分图
[ComponentData3] = ComponentEEM(AnalysisData3,3) %3为确定的组分数,AnalysisData3表示为3组分随机初始化后的结果,若组分数确定为4则将第三和第四行的AnalysisData3改为AnalysisData4,并且等号后面括号中的3也改为4,组分为5以此类推
%导出数据
AutoSaveData(AnalysisData3,Path,8,3);
% 8是保存文件确认参数,不可更改;3为确定的组分数,AnalysisData3表示为3组分随机初始化后的结果,若组分数确定为4则将第三和第四行的AnalysisData3改为AnalysisData4,并且等号后面括号中的3也改为4,组分为5以此类推
%导出各组分三维数据,用于其他软件重绘组分图
AutoSaveData(ComponentData3,Path,9,3);
% 9是保存文件确认参数,不可更改;3为确定的组分数,AnalysisData3表示为3组分随机初始化后的结果,若组分数确定为4则将第三和第四行的AnalysisData3改为AnalysisData4,并且等号后面括号中的3也改为4,组分为5以此类推