В этом примере показано, как использовать Global Optimization Toolbox с Bioinformatics Toolbox™ для оптимизации поиска функций для классификации данных масс-спектрометрии (SELDI).
Генетические алгоритмы оптимизируют результаты поиска для задач с большими наборами данных. Вы можете использовать функцию генетического алгоритма MATLAB ®, чтобы решить эти проблемы в биоинформатике. Генетические алгоритмы были применены к филогенетическим созданиям дерева, экспрессии генов и масс-спектрометрии данных анализу и многим другим областям биоинформатики, которые имеют большие и вычислительно дорогие проблемы. Этот пример ищет оптимальные функции ( peaks) в данных масс-спектрометрии. Мы будем искать конкретный peaks в данных, которые отличают больных раком от контрольных пациентов.
Сначала ознакомьтесь с Global Optimization Toolbox. Документация описывает, как работает генетический алгоритм и как его использовать в MATLAB. Для доступа к документации используйте команду doc.
doc ga
Исходные данные в этом примере получены из Банка данных программы клинической протеомики FDA-NCI. Это набор выборок от 121 пациента с раком яичников и 95 пациентов с контролем. Подробное описание этого набора данных см. в разделах [1] и [2].
Этот пример предполагает, что у вас уже есть предварительно обработанные данные OvarianCancerQAQCdataset.mat. Однако, если у вас нет файла данных, можно воссоздать, выполнив шаги в примере Пакетная обработка спектров с использованием последовательных и параллельных вычислений.
Также можно запустить скрипт msseqprocessing.m.
addpath(fullfile(matlabroot,'examples','bioinfo','main')) % Make sure the supporting files are on the search path type msseqprocessing
% MSSEQPROCESSING Script to create OvarianCancerQAQCdataset.mat (used in
% CANCERDETECTDEMO). Before running this file initialize the variable
% "repository" to the full path where you placed you mass-spectrometry
% files. For Example:
%
% repository = 'F:/MassSpecRepository/OvarianCD_PostQAQC/';
%
% or
%
% repository = '/home/username/MassSpecRepository/OvarianCD_PostQAQC/';
%
% The approximate time of execution is 18 minutes (Pentium 4, 4GHz). If you
% have the Parallel Computing Toolbox refer to BIODISTCOMPDEMO to see
% how you can speed this analysis up.
% Copyright 2003-2008 The MathWorks, Inc.
repositoryC = [repository 'Cancer/'];
repositoryN = [repository 'Normal/'];
filesCancer = dir([repositoryC '*.txt']);
NumberCancerDatasets = numel(filesCancer);
fprintf('Found %d Cancer mass-spectrograms.\n',NumberCancerDatasets)
filesNormal = dir([repositoryN '*.txt']);
NumberNormalDatasets = numel(filesNormal);
fprintf('Found %d Control mass-spectrograms.\n',NumberNormalDatasets)
files = [ strcat('Cancer/',{filesCancer.name}) ...
strcat('Normal/',{filesNormal.name})];
N = numel(files); % total number of files
fprintf('Total %d mass-spectrograms to process...\n',N)
[MZ,Y] = msbatchprocessing(repository,files);
disp('Finished; normalizing and saving to OvarianCancerQAQCdataset.mat.')
Y = msnorm(MZ,Y,'QUANTILE',0.5,'LIMITS',[3500 11000],'MAX',50);
grp = [repmat({'Cancer'},size(filesCancer));...
repmat({'Normal'},size(filesNormal))];
save OvarianCancerQAQCdataset.mat Y MZ grp
Как только у вас есть предварительно обработанные данные, вы можете загрузить их в MATLAB.
load OvarianCancerQAQCdataset
whos
Name Size Bytes Class Attributes MZ 15000x1 120000 double Y 15000x216 25920000 double grp 216x1 25056 cell
Существует три переменные: MZ, Y, grp. MZ является вектором массы/заряда, Y - значения интенсивности для всех 216 пациентов (контроль и рак), и grp содержит индекс информацию о том, какой из этих выборок представляет онкологических пациентов и какие таковые представляют нормальных пациентов. Чтобы визуализировать эти данные, смотрите пример «Идентификация значимых функций и классификация профилей белка».
Инициализируйте переменные, используемые в примере.
[numPoints, numSamples] = size(Y); % total number of samples and data points id = grp2idx(grp); % ground truth: Cancer=1, Control=2
Генетический алгоритм требует целевой функции, также известной как функция соответствия, которая описывает феномен, который мы хотим оптимизировать. В этом примере машина генетического алгоритма проверяет небольшие подмножества значений M/Z, используя функцию соответствия, и затем определяет, какие значения M/Z передаются или удаляются из каждой последующей генерации. Биогафит функции соответствия передается решателю генетического алгоритма с помощью указателя на функцию. В этом примере биогафит максимизирует разделяемость двух классов с помощью линейной комбинации 1) a-апостериорная вероятность и 2) эмпирическая вероятность ошибки линейного классификатора (классификация). Можно создать свою собственную функцию соответствия, чтобы попробовать различные классификаторы или альтернативные методы для оценки эффективности классификаторов.
type biogafit
function classPerformance = biogafit(thePopulation,Y,id)
%BIOGAFIT The fitness function for BIOGAMSDEMO
%
% This function uses the classify function to measure how well mass
% spectrometry data is grouped using certain masses. The input argument
% thePopulation is a vector of row indices from the mass spectrometry
% data Y. Classification performance is a linear combination of the error
% rate and the posteriori probability of the classifier.
% Copyright 2003-2013 The MathWorks, Inc.
thePopulation = round(thePopulation);
try
[c,~,p] = classify(Y(thePopulation,:)',Y(thePopulation,:)',double(id),'linear');
cp = classperf(id,c);
classPerformance = 100*cp.ErrorRate + 1 - mean(max(p,[],2));
catch
% In case pooled covariance matrix is not positive definite we try a
% naive-Bayes classifier:
try
[c,~,p] = classify(Y(thePopulation,:)',Y(thePopulation,:)',double(id),'diaglinear');
cp = classperf(id,c);
classPerformance = 100*cp.ErrorRate + 1 - mean(max(p,[],2));
catch
classPerformance = Inf;
end
end
Пользователи могут изменить, как оптимизация выполняется генетическим алгоритмом, создав пользовательские функции для кроссовера, масштабирования соответствия, мутации, выбора и создания населения. В этом примере вы будете использовать функцию biogacreate, написанную для этого примера, чтобы создать начальные случайные точки данных из данных масс-спектрометрии. Заголовок функции требует определенных входных параметров, заданных документацией GA. В тулбоксе есть функция создания по умолчанию для создания начальных генеральных совокупностей точек данных.
type biogacreate
function pop = biogacreate(GenomeLength,~,options,Y,id) %BIOGACREATE Population creation function for MSGADEMO % % This function creates a population matrix with dimensions of % options.PopulationSize rows by the number of independent variables % (GenomeLength) columns. These values are integers that correspond to % randomly selected rows of the mass spectrometry data Y. Each row of the % population matrix is a random sample of row indices of the mass spec % data. % Note: This function's input arguments are required by the GA function. % See GA documentation for further detail. % Copyright 2005-2013 The MathWorks, Inc. pop = zeros(options.PopulationSize,GenomeLength); npop = numel(pop); ranked_features = rankfeatures(Y,id,'NumberOfIndices',npop,'NWeighting',.5); pop(:) = randsample(ranked_features,npop);
Функция GA использует структуру опций, чтобы удерживать параметры алгоритма, которые она использует при выполнении минимизации с помощью генетического алгоритма. Функция optimoptions создаст эту структуру опций. В целях этого примера генетический алгоритм будет запускаться только в течение 50 генерации. Однако вы можете задать 'Generations' большее значение.
options = optimoptions('ga','CreationFcn',{@biogacreate,Y,id},... 'PopulationSize',120,... 'Generations',50,... 'Display','iter')
options =
ga options:
Set properties:
CreationFcn: {1x3 cell}
Display: 'iter'
MaxGenerations: 50
PopulationSize: 120
Default properties:
ConstraintTolerance: 1.0000e-03
CrossoverFcn: @crossoverscattered
CrossoverFraction: 0.8000
EliteCount: '0.05*PopulationSize'
FitnessLimit: -Inf
FitnessScalingFcn: @fitscalingrank
FunctionTolerance: 1.0000e-06
HybridFcn: []
InitialPopulationMatrix: []
InitialPopulationRange: []
InitialScoresMatrix: []
MaxStallGenerations: 50
MaxStallTime: Inf
MaxTime: Inf
MutationFcn: {@mutationgaussian [1] [1]}
NonlinearConstraintAlgorithm: 'auglag'
OutputFcn: []
PlotFcn: []
PopulationType: 'doubleVector'
SelectionFcn: @selectionstochunif
UseParallel: 0
UseVectorized: 0
Используйте ga, чтобы запустить функцию генетического алгоритма. 100 групп по 20 точек данных каждая будет развиваться более 50 генерация. События отбора, кроссовера и мутации генерируют новое население в каждой генерации.
% initialize the random generators to the same state used to generate the % published example rng('default') nVars = 12; % set the number of desired features FitnessFcn = {@biogafit,Y,id}; % set the fitness function feat = ga(FitnessFcn,nVars,options); % call the Genetic Algorithm feat = round(feat); Significant_Masses = MZ(feat) cp = classperf(classify(Y(feat,:)',Y(feat,:)',id),id); cp.CorrectRate
Best Mean Stall
Generation Func-count f(x) f(x) Generations
1 240 2.827 8.928 0
2 354 2.827 8.718 1
3 468 0.9663 8.001 0
4 582 0.9516 7.249 0
5 696 0.9516 6.903 1
6 810 0.4926 6.804 0
7 924 0.4926 6.301 1
8 1038 0.02443 5.215 0
9 1152 0.02443 4.77 1
10 1266 0.02101 4.084 0
11 1380 0.02101 3.792 1
12 1494 0.01854 3.437 0
13 1608 0.01606 3.44 0
14 1722 0.01372 2.768 0
15 1836 0.01218 2.74 0
16 1950 0.01204 2.471 0
17 2064 0.01204 2.649 1
18 2178 0.01189 2.326 0
19 2292 0.01189 2.003 0
20 2406 0.0118 2.341 0
21 2520 0.01099 1.714 0
22 2634 0.01094 1.828 0
23 2748 0.01094 1.94 1
24 2862 0.01094 2.285 2
25 2976 0.009843 2.026 0
26 3090 0.009843 1.899 1
27 3204 0.009183 1.802 0
28 3318 0.007877 1.5 0
29 3432 0.007788 1.793 0
30 3546 0.007788 1.756 1
Best Mean Stall
Generation Func-count f(x) f(x) Generations
31 3660 0.007091 1.719 0
32 3774 0.006982 1.598 0
33 3888 0.006982 1.269 1
34 4002 0.006732 1.279 0
35 4116 0.005008 1.229 0
36 4230 0.004325 1.179 0
37 4344 0.004325 1.534 1
38 4458 0.003982 1.15 0
39 4572 0.003982 0.9602 1
40 4686 0.003982 0.8547 2
41 4800 0.003891 0.9083 0
42 4914 0.003683 0.7409 0
43 5028 0.003683 0.516 1
44 5142 0.003364 0.5153 0
45 5256 0.003172 0.4218 0
46 5370 0.003172 0.3783 1
47 5484 0.002997 0.1883 0
48 5598 0.002675 0.1297 0
49 5712 0.002611 0.04382 0
50 5826 0.002519 0.007859 0
Optimization terminated: maximum number of generations exceeded.
Significant_Masses =
1.0e+03 *
7.6861
7.9234
8.9834
8.6171
7.1808
7.3057
8.1132
8.5241
7.0527
7.7600
7.7442
7.7245
ans =
1
Чтобы визуализировать, какие функции были выбраны генетическим алгоритмом, данные строятся с пиковыми положениями, отмеченными красными вертикальными линиями.
xAxisLabel = 'Mass/Charge (M/Z)'; % x label for plots yAxisLabel = 'Relative Ion Intensity'; % y label for plots figure; hold on; hC = plot(MZ,Y(:,1:15) ,'b'); hN = plot(MZ,Y(:,141:155),'g'); hG = plot(MZ(feat(ceil((1:3*nVars )/3))), repmat([0 100 NaN],1,nVars),'r'); xlabel(xAxisLabel); ylabel(yAxisLabel); axis([1900 12000 -1 40]); legend([hN(1),hC(1),hG(1)],{'Control','Ovarian Cancer', 'Discriminative Features'}, ... 'Location', 'NorthWest'); title('MS Data with Discriminative Features found by Genetic Algorithm');

Наблюдайте интересный пик около 8100 Да., который, по-видимому, смещен вправо на здоровых выборках.
axis([8082 8128 -.5 4])

[1] Conrads, T P, V A Fusaro, S Ross, D Johann, V Rajapakse, B A Hitt, S M Steinberg, et al. «Сывороточные протеомные функции высокого разрешения для выявления рака яичников». Рак, связанный с эндокринной системой, июнь 2004, 163-78.
[2] Petricoin, Emanuel F, Ali M Ardekani, Ben A Hitt, Peter J Levine, Vincent A Fusaro, Seth M Steinberg, Gordon B Mills, et al. «Использование протеомных шаблонов в сыворотке для идентификации рака яичников». Lancet 359, № 9306 (февраль 2002): 572-77.