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;
}