兄弟(同胞)の遺伝子はどれくらい似ているか(2)

  • これの続き
    • 組み換えを考慮する前に、染色体の長さが均等でない場合を考えよう
    • 前回は、すべての染色体の長さが同じものと仮定した。
    • 全部でk種類の染色体があり、\sum_{i=1}^k l_i=1なる長さl_iの染色体とする
      • 同胞がシェアする期待値はE=\sum_{i}^{2^k} \sum_{j}^{2^k} (\frac{1}{2^k}\frac{1}{2^k}) (\sum_{x\in P_i \bigcap P_j} l_x)
        • ただしP_iはk種類の染色体の父母由来を0,1であらわしたときに、1となるような染色体番号を要素とした集合であるものとする
        • この式はE=\frac{1}{2^{2k}}(\sum_{x}^k l_x)\times \frac{1}{2} 2^{2k}=\frac{1}{2}となって、もちろん、同胞がシェアする染色体部分の期待値は\frac{1}{2}である。
      • 問題は、分散V=\sum_{i}^{2^k} \sum_{j}^{2^k} (\frac{1}{2^k}\frac{1}{2^k}) ((\sum_{x\in P_i \bigcap P_j} l_x)-\frac{1}{2})^2である。簡単には出ないので、以下のようなソースで出してみる。
        • 染色体の長さの分散が小さく、ゼロのときにV=\frac{1}{4k}。染色体の長さの分散が大きくなるにつれ、その値より大きくなる。1本の染色体がほぼ全長になったときが分散は最大で、、そのときは、V=\frac{1}{4\times 1}に収束する。
        • 逆に言えば、同胞がシェアする部分の期待値は\frac{1}{2}で、その分散がVであるとき、効果的染色体本数(同長の染色体であったと仮定したときの染色体本数をこう呼ぶこととする)Nef=\frac{1}{4\times V}と考えることもできる
  • さて、組み換えがある場合は・・・続きはこちらこれの続き
  • Javaソース
package siblingShare;

public class TestSibPairFrac {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int k=22;
		int y=100;
		
		int df1=1;
		int df2=2;
		/*
		for(int i=0;i<f.length;i++){
			System.out.print(f[i]+"\t");
		}
		*/
		int repeat=10000;
		
		double a1=0.5;
		double a2=0.5;
		for(int z=0;z<y;z++){
			double[] f=new double[k];
			for(int i=0;i<f.length;i++){
				for(int j=0;j<z+1;j++){
					f[i]+=Math.random();
				}
				
				//f[i]=1;
			}
			StatUtilsX.MiscUtilY.standard(f);
			double mean0 = StatUtilsX.MiscUtilY.momentX(f,0,1);

			double var0 = StatUtilsX.MiscUtilY.momentCentralX(f,df2);

			double[] value=new double[repeat];
			for(int i=0;i<repeat;i++){
				
				for(int j=0;j<f.length;j++){
					double r1=Math.random();
					double r2=Math.random();
					if((r1<a1 && r2<a2)||(r1>a1 && r2>a2)){
						value[i]+=f[j];
					}
				}
			}

			double mean = StatUtilsX.MiscUtilY.momentX(value,0,1);

			double var = StatUtilsX.MiscUtilY.momentCentralX(value,df2);
			System.out.print("mean0\t" + mean0 +"\tvar0\t"+var0 +"\t");

			System.out.println("mean\t" + mean +"\tvar\t"+var);
		}
		System.out.println(1/(4.0*k));
		
	}

}