String 如何使用字符串的切片计算字符串中给定字符的概率?

String 如何使用字符串的切片计算字符串中给定字符的概率?,string,probability,bioinformatics,String,Probability,Bioinformatics,给定一个字符串,例如010010101010011011,我们可以随机切片多个子字符串。假设在切片过程中,由于一些意外噪音,某些字符可能会翻转(0->1或1->0)。例如: Position: 0123456789......... String: 01001010101001101011 slice1: 1001110101000 slice2: 1010111001111 slice3: 10101 slice4: 11010

给定一个字符串,例如
010010101010011011
,我们可以随机切片多个子字符串。假设在切片过程中,由于一些意外噪音,某些字符可能会翻转(
0->1
1->0
)。例如:

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

slice1:    1001110101000
slice2:       1010111001111
slice3:       10101
slice4:                1101011
slice1
从位置1开始(假设字符串的索引从0开始),
slice2
从位置4开始,
slice3
从4开始,
slice4
从13开始。在
slice1
中,
0
在位置5翻转到
1
,而
1
在位置13翻转到
0

对于原始字符串中的一个特定位置,如果它是
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
)。

对于字符串中的每个位置,我们都有n比特量(来自切片的信息)。假设k其中有'1'

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

要找到原始字符串在该位置包含“1”的概率p,我们将使用。我们首先需要找到原始字符串中的“0”产生k=1的概率,如果n=3(那么一个1和两个0)。在本例中:0.243。然后我们需要概率a“1”在n=3时产生k=1。这是0.027。现在我们终于得到了在原始字符串中是“1”的概率:p=0.027/(0.243+0.027)=0.1

我假设你可以自己得到n和k(每个职位)

private float p1=0.5;
私人浮动p01=0.1;
私人浮动p10=0.1;
专用浮点probItsOne(整数n,整数k)
{
如果(n==0)
返回p1;
float probByZero=二项式(n,p01,k);//给定n,一个“0”将生成这个k的概率
float probByOne=二项式(n,p10,n-k);
返回probByOne/(probByZero+probByOne);
}
//(此p与我的解释不同)
私有浮点二项式(整数n,浮点p,整数k)
{
返回组合(n,k)*数学功率(p,k)*数学功率(1-p,n-k);
}
私有整数组合(整数n,整数k)
{
收益率(int)(阶乘(n)/(阶乘(k)*阶乘(n-k));
}
私有长阶乘(整数n)
{
长期结果=1;

对于(int i=2;我问?@Pierre在我看来,这个问题更多的是关于统计建模,而不是关于生物学或编程。一旦找到合适的模型,算法或公式将是直接的。是的,我同意cel。虽然这个问题是一个简化的深度排序方法,但我也认为它是一个纯概率问题。你是r是的!二项分布模型显示了重复试验中成功的总次数。。。
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;
}