Matlab:seqlogo具有统一的打印柱高度

Matlab:seqlogo具有统一的打印柱高度,matlab,statistics,charts,probability,bioinformatics,Matlab,Statistics,Charts,Probability,Bioinformatics,在Matlab中,我想制作一个氨基酸序列剖面图。但是,我不希望通过熵来缩放绘图列的高度,而是希望所有列的高度都相同 我正在修改答案中的代码,但我想知道seqlogo是否有一个参数或其他一些我遗漏的函数,可以使列高度一致 或者,我是否可以对序列配置文件应用统计转换来破解所需的输出?(柱高均匀,每个字母的高度与 它在seqprofile中的概率)解决此问题的最简单方法可能是直接修改的代码(如果可能)。在R2010b中,您可以执行以下操作: edit seqlogo 该函数的代码将显示在编辑器中。接

在Matlab中,我想制作一个氨基酸序列剖面图。但是,我不希望通过熵来缩放绘图列的高度,而是希望所有列的高度都相同

我正在修改答案中的代码,但我想知道seqlogo是否有一个参数或其他一些我遗漏的函数,可以使列高度一致

或者,我是否可以对序列配置文件应用统计转换来破解所需的输出?(柱高均匀,每个字母的高度与
它在seqprofile中的概率)

解决此问题的最简单方法可能是直接修改的代码(如果可能)。在R2010b中,您可以执行以下操作:

edit seqlogo
该函数的代码将显示在编辑器中。接下来,找到以下行(第267-284行)并将其注释掉或完全删除:

S_before = log2(nSymbols);
freqM(freqM == 0) = 1; % log2(1) = 0

% The uncertainty after the input at each position
S_after = -sum(log2(freqM).*freqM, 1);

if corrError
    % The number of sequences correction factor
    e_corr = (nSymbols -1)/(2* log(2) * numSeq);
    R = S_before - (S_after + e_corr);
else
    R = S_before - S_after;
end

nPos = (endPos - startPos) + 1;
for i =1:nPos
    wtM(:, i) = wtM(:, i) * R(i);
end
然后把这条线放在他们的位置上:

wtM = bsxfun(@times,wtM,log2(nSymbols)./sum(wtM));
您可能希望以新名称保存文件,如
seqlogo\u norm.m
,这样您仍然可以使用原始的未修改函数。现在,您可以创建序列纵断面图,所有列规格化为相同高度。例如:

S = {'LSGGQRQRVAIARALAL',...      %# Sample amino acid sequence
     'LSGGEKQRVAIARALMN',...
     'LSGGQIQRVLLARALAA',...
     'LSGGERRRLEIACVLAL',...
     'FSGGEKKKNELWQMLAL',...
     'LSGGERRRLEIACVLAL'};
seqlogo_norm(S,'alphabet','aa');  %# Use the modified SEQLOGO function
S = {'ATTATAGCAAACTA',...  %# Sample sequence
     'AACATGCCAAAGTA',...
     'ATCATGCAAAAGGA'};
seqlogo_new(S);            %# After applying the above modification

旧答案:

我不确定如何转换序列配置文件信息以从中获得所需的输出,但我可以向您展示如何修改我为您编写的链接到的备选
seqlogo_new.m
。如果更改初始化
位值的行,请执行以下操作:

bitValues = W{2};
为此:

bitValues = bsxfun(@rdivide,W{2},sum(W{2}));
然后,应将每个列的高度缩放为1。例如:

S = {'LSGGQRQRVAIARALAL',...      %# Sample amino acid sequence
     'LSGGEKQRVAIARALMN',...
     'LSGGQIQRVLLARALAA',...
     'LSGGERRRLEIACVLAL',...
     'FSGGEKKKNELWQMLAL',...
     'LSGGERRRLEIACVLAL'};
seqlogo_norm(S,'alphabet','aa');  %# Use the modified SEQLOGO function
S = {'ATTATAGCAAACTA',...  %# Sample sequence
     'AACATGCCAAAGTA',...
     'ATCATGCAAAAGGA'};
seqlogo_new(S);            %# After applying the above modification

目前,我的解决方法是生成一组与序列配置文件匹配的伪序列,然后将这些序列提供给。以下是制作假序列的代码:

function flatFakeSeqsFromPwm(pwm, letterOrder, nSeqsToGen, outFilename)
%translates a pwm into a bunch of fake seqs with the same probabilities
%for use with http://weblogo.berkeley.edu/

%pwm should be a 4xn or a 20xn position weight matrix. Each col must sum to 1
%letterOrder = e.g. 'ARNDCQEGHILKMFPSTWYV' for my data
%nSeqsToGen should be >= the # of pixels tall you plan to make your chart

[height windowWidth] = size(pwm);
assert(height == length(letterOrder));
assert(isequal(abs(1-sum(pwm)) < 1.0e-10, ones(1, windowWidth))); %assert all cols of pwm sum to 1.0

fd = fopen(outFilename, 'w');

for i = 0:nSeqsToGen-1
    for seqPos = 1:windowWidth
        acc = 0; %accumulator
        idx = 0;
        while i/nSeqsToGen >= acc
            idx = idx + 1;
            acc = acc + pwm(idx, seqPos);
        end
        fprintf(fd, '%s', letterOrder(idx));
    end
    fprintf(fd, '\n');
end

fclose(fd);
end
功能flatFakeSeqsFromPwm(pwm、letterOrder、nSeqsToGen、OutfielName)
%将pwm转换为一组具有相同概率的伪序列
%用于http://weblogo.berkeley.edu/
%pwm应为4xn或20xn位置权重矩阵。每个列的总和必须为1
%letterOrder=例如“arndcqeghilkmfstwyv”用于我的数据
%nSeqsToGen应该>=您计划制作图表的像素高度
[高度窗口宽度]=尺寸(pwm);
断言(高度==长度(字母顺序));
断言(等质量(abs(1-sum(pwm))<1.0e-10,1,窗宽));%将pwm总和的所有列断言为1.0
fd=fopen(输出管名称“w”);
对于i=0:nSeqsToGen-1
对于seqPos=1:窗口宽度
acc=0;%累加器
idx=0;
而i/nSeqsToGen>=acc
idx=idx+1;
acc=acc+pwm(idx,seqPos);
结束
fprintf(fd,'%s',信笺(idx));
结束
fprintf(fd,'\n');
结束
fclose(fd);
结束

谢谢!但正如我在问题中提到的,我正在绘制一个氨基酸序列,所以我需要的不仅仅是你提供的四个字母。@Jon:啊,我错过了。明天我将尝试另一个更完整的解决方案。感谢您提供了优雅的解决方案,并向我展示了如何编辑库fns:)