生物信息论分形绘图

题目:

  画出一个随机产生的基因碱基序列中四个碱基A,G,T,和C组成数量为k(k=3)的碱基链组合在其中的概率分步图,例如下图:

实现思路及步骤(Matlab实现):

       理论上,主要有两个困难,一是以四个碱基分布的概率去随机产生四个碱基之一,为便于整体的设计,用四进制的0,1,2,3分别代表四个碱基A,G,T,C,本报告采用利用rand()函数设计了新的函数RandHere(),具体调用方法是:

RandGetted = RandHere(Pofbase);

Pofbase是一个四维向量,为四个碱基的分布概率,返回值RandGetted为随机产生的碱基;实现思想是将rand()按照Pofbase划分区间。

       二是碱基序列与图上位置的对应,为减少程序的时间复杂性和空间复杂性,本报告借助散列函数的思想,注意到这个问题实际上是四进制和二进制的相互转化,比如k=3时,TAG对应四进制数字为201,将其中每个数字用二进制表示,即为(10),(00)和(01),则有:,推广至k=N,有,对于序列,翻译成四进制数字为,用二进制数字表示为,则序列对应的坐标(x,y)为下式:

具体调用函数如下:

 [m,n] = BaseToPosition(BaseVector);

[m,n]为返回的坐标值,BaseVector为用四进制表示的碱基序列。

       技术上,使用imagesc()函数进行绘图,并加了颜色条,进行了动画显示,主函数调用以如下方式调用:

draw(datasize,Pofbase,k);

datasize为总序列规模,Pofbase为概率分布,k为序列长度。

结果表现:

1.以k=6为例调用函数如下:

draw(1000000,[0.4,0.1,0.35,0.25],6);

结果如下:

2.以k=8,概率分布均匀得调用主函数如下:

draw(1000000,[0.25,0.25,0.25,0.25],8);

结果如下基本呈均匀分布:

3.以k=10,概率分布不均匀调用如下:

draw(2000000,[0.2,0.3,0.4,0.1],10);

代码:

draw.m

function draw(datasize,Pofbase,k)
%% draw the picture
%  using 0,1,2,3 to represent A,T,G and C 
% datasize为数据规模,Probase为四碱基概率,k为链长
% 图形展示方面有待使用GUI编程减小时间复杂性
% 如果是导入数据,程序只需简单修改
Dimension = sqrt(4^k);
Base = zeros(Dimension,Dimension);  %初始化矩阵
Basekeeper = zeros(1,k);  %用于输入转换函数
caxis_end = floor(max(Pofbase)^k*datasize)+1;
for j = 1:k
    Basekeeper(j) = RandHere(Pofbase);
end
[x0,y0] = BaseToPosition(Basekeeper);
figure
imagesc(Base);
caxis('manual')
colorbar;
drawnow;
tau = k;
title(sprintf('k = %1d,tau = %1d',k,tau),'Fontsize',14)
for i = 1:(datasize-k)
    
    Basekeeper(1:k-1) =  Basekeeper(2:k);
   
    Basekeeper(k) = RandHere(Pofbase);
    [x,y] = BaseToPosition(Basekeeper);
    Base(x,y) = Base(x,y) + 1;
    tau = tau  +1;
    if rem(i+k,10000)==0
        imagesc(Base);     
        caxis([0,caxis_end]);
        colorbar;
        title(sprintf('k = %1d,tau = %1d',k,tau),'Fontsize',14)
        drawnow;
    end
end
end
 
%% 概率产生函数分四碱基概率不同进行
function RandGetted = RandHere(Pofbase)
PofRange = Pofbase;
PofRange(2) = sum(Pofbase(1:2));
PofRange(3) = PofRange(2) + PofRange(3);
PofRange(4) = 1;
randN = rand;
if 0<randN &&randN<=PofRange(1)
             RandGetted = 0;
elseif PofRange(1)<randN &&randN<=PofRange(2)
             RandGetted = 1;
elseif PofRange(2)<randN &&randN<=PofRange(3)
             RandGetted = 2;
else 
             RandGetted = 3;
    end
end
 
%% 碱基到坐标的转换函数:本质上是四进制到二进制之间的转换
%通过单个坐标和碱基0,1,2,3数值进行比较发现可以用
% 二进制作为工具:比如k=3时,201,对应的二进制数为(1,0),(0,0)和(0,1)
% 则x = 1*2^2+0*2+0*1 +1,y = 0*2^2 + 0*2 +1*1+1;
function [m,n] = BaseToPosition(BaseVector)
k = length(BaseVector);
m = 1;n = 1;%初始位置
BaseTempVector = zeros(k,2);
for i =1:k
      BaseTempVector(i,1) = floor(BaseVector(i)/2);
      BaseTempVector(i,2) = rem(BaseVector(i),2);  
      
      BaseTempVector(i,1)=BaseTempVector(i,1)*2^(k-i);
      BaseTempVector(i,2) = BaseTempVector(i,2)*2^(k-i);    
end
m = m + sum(BaseTempVector(:,1));
n = n + sum(BaseTempVector(:,2));
%Position = [m,n];
end

 

posted @ 2016-10-09 20:59  Codsir  阅读(732)  评论(0编辑  收藏  举报