2014-07-26 61 views
2

給定一個字符串,例如01001010101001101011,我們可以隨機切分多個子字符串。假設在切片過程中,由於一些意想不到的噪音,某些字符可能會翻轉(0->11->0)。例如:從位置1如何使用此字符串的切片來計算字符串中給定字符的概率?

Position:......... 
String: 01001010101001101011 

slice1: 1001110101000 
slice2:  1010111001111 
slice3:  10101 
slice4:    1101011 

slice1開始(假設字符串的索引從0開始),從位置4開始slice2,由4- slice3開始,並且從13 slice4開始在slice10翻轉到1在5位和1翻轉到0在位置13

對於原始串的一個特定位置,如果是1,然後在切片翻到0的概率爲0.1;反之亦然(即Prob(0->1)=0.1)。

問題是:如果我們只有多個切片(每個切片的長度可能會有所不同)及其在字符串中的起始位置,並且我們不知道原始字符串,因爲原始字符串中的任意位置,我們如何計算位置爲1的概率?

假設大部分職位將在切片至少一次覆蓋,我們有以下參數:

p01=0.1; // Probability a ‘0’ in string but flipped to a ‘1’ in a slice 
p10=0.1; // Probability a ‘1’ in string but flipped to a ‘0’ in a slice 
p1=0.5; // Prior probability that any given position in string is a ‘1’ 

我們也可以假設字符串是0和1的隨機字符串,並在切割時,每個位置都是獨立採樣的。

對於上面的例子字符串和四片,我們已經爲每個位置以下的概率:

Pos Prob 
0 0.500 
1 0.900 
2 0.100 
3 0.100 
4 0.999 
5 0.100 
6 0.999 
7 0.001 
8 0.999 
9 0.500 
10 0.988 
11 0.012 
12 0.012 
13 0.900 
14 0.988 
15 0.500 
16 0.988 
17 0.100 
18 0.900 
19 0.900 

我花了幾個小時試圖找出如何讓上面的答案,我可以算的0號碼s和1 s在所有切片中爲每個位置添加一個程序。然而,我仍然無法找到一個模型算法來計算概率,特別是對於位置4(1,1,1),5(1,0,0),9(0,1),13(0,1,1)。

+0

問http://www.biostars.org/? – Pierre

+0

@Pierre在我看來,這個問題更多的是關於統計建模而不是關於生物學或編程。一旦找到合適的模型,算法或公式將會很簡單。 – cel

+0

是的,我同意cel。雖然這個問題是一個簡化的深度排序方法,但我也認爲這是一個純粹的概率問題。 – boyang

回答

2

對於字符串中的每個位置,我們有n位數量(來自切片的信息)。假設k是'1'。

在你的例子中,在位置5,我們有n = 3和k = 1。

要查找原始字符串在該位置包含'1'的概率p,我們將使用binomial distribution。如果n = 3(所以一個1和兩個0),我們首先需要找到原始字符串中'0'產生k = 1的概率。在這種情況下:0.243。那麼,如果n = 3,我們需要'1'產生k = 1的概率。這是0.027。現在我們最終有可能在原始字符串中是'1':p = 0.027 /(0.243 + 0.027)= 0。1

我假設你可以自己獲得n和k(每個位置)。使用C#或Java代碼:

private float p1 = 0.5; 
private float p01 = 0.1; 
private float p10 = 0.1; 

private float probItsOne(int n, int k) 
{ 
    if (n == 0) 
     return p1; 
    float probByZero = binomial(n, p01, k); // probability a '0' would generate this k, given n 
    float probByOne = binomial(n, p10, n - k); 
    return probByOne/(probByZero + probByOne); 
} 

// (this p is not the same as in my explanation) 
private float binomial(int n, float p, int k) 
{ 
    return combinations(n, k) * Math.Pow(p, k) * Math.Pow(1 - p, n - k); 
} 

private int combinations(int n, int k) 
{ 
    return (int)(factorial(n)/(factorial(k) * factorial(n - k)); 
} 

private long factorial(int n) 
{ 
    long result = 1; 
    for (int i = 2; i <= n; n++) 
     result *= i; 
    return result; 
} 
+0

你是對的!二項式分佈模擬重複試驗中成功的總數... – boyang