Jump to content

Calculating Inbreeding on a 10 Generation Pedigree


Triple_Deuce

Recommended Posts

In the code I posted, A - J would be in the sires array and O - U would be in the dams array, which would produce no common ancestors

 

Yes, this is correct but I was talking about getting U's ICO... 

 

Based on given info I get .5 (50%) as inbreeding on FU (ID#: 59) instead of .375 (37.5%).

Edited by Triple_Deuce
Link to comment
Share on other sites

I get these results, which look right to me

DOG: J
|     A |   0.0312 |   2 |   2 |
|     A |   0.0312 |   2 |   2 |
|     B |   0.0312 |   2 |   2 |
|     B |   0.0312 |   2 |   2 |
      COI : 0.1250


DOG: U
|     Q |   0.1250 |   1 |   1 |
|     O |   0.0312 |   2 |   2 |
|     O |   0.0312 |   2 |   2 |
|     P |   0.0312 |   2 |   2 |
|     P |   0.0312 |   2 |   2 |
|     R |   0.1250 |   1 |   1 |
      COI : 0.3750


DOG: Z
      COI : 0.0000

Link to comment
Share on other sites

Those results were from my own code.

 

Yours almost agrees with mine in that we both get

|  44 | A                  |   2,2|   2,2|

but I interpret that as

 

A  |  0.03125 | 2  | 2  |

A  |  0.03125 | 2  | 2  |

 

whereas you apparently have doubled it to

 

A  |  0.03125 | 2  | 2  |

A  |  0.03125 | 2  | 2  |

A  |  0.03125 | 2  | 2  |

A  |  0.03125 | 2  | 2  |

Link to comment
Share on other sites

Ok, as I was typing this, I think i see my error!

DogU is supposed to be .375 (37.5%)

DogO & DogP are only behind DogU TWICE.

 

I have my equation in a nested foreach() which is why I'm getting the 4 extra (2 of each) when I shouldnt.

 foreach($sires[$id] as $keyS => $valueS){
             	foreach($dams[$id] as $keyD => $valueD){
             		$ico = pow(.5,($valueS + $valueD + 1)) + $ico;
             	}
             }

What would be the best approach to break out of that and and potentially pair either $sires or $dams with empty $valueD/S?

Edited by Triple_Deuce
Link to comment
Share on other sites

Ok, I've put in the following:

 $c = array_map(function () {
		    return array_sum(func_get_args());
		}, $sires[$id], $dams[$id]);
		
		foreach($c AS $key =>$value){
			$ico = pow(.5,($value + 1)) + $ico;
		}
				
		print_r($c);

which calculates U correctly now... however J is now wrong, it's showing as 0.125 instead of .5 (full sibling x full sibling = .5 (50%)).  What am I missing?

Link to comment
Share on other sites

This my best attempt yet. Instead of counting I store the traversed path then eliminate duplicates.

<?php
//
// ARRAY OF DOGS
//   id => [sire, dam, name]
//
$dogs = array ( 
    1 => array ( 0 => '2', 1 => '3', 2 => 'Nimh\'s Delorean', ), 
    2 => array ( 0 => '4', 1 => '9', 2 => 'Dog B', ), 
    3 => array ( 0 => '7', 1 => '8', 2 => 'Dog C', ), 
    4 => array ( 0 => '7', 1 => '9', 2 => 'Dog E', ), 
    5 => array ( 0 => '10', 1 => '11', 2 => 'Dog F', ), 
    7 => array ( 0 => '14', 1 => '15', 2 => 'Dog H', ), 
    8 => array ( 0 => '16', 1 => '17', 2 => 'Dog I', ), 
    9 => array ( 0 => '16', 1 => '17', 2 => 'Dog J', ), 
    10 => array ( 0 => '18', 1 => '19', 2 => 'Dog K', ), 
    11 => array ( 0 => '20', 1 => '21', 2 => 'Dog L', ), 
    14 => array ( 0 => '20', 1 => '17', 2 => 'Dog O', ), 
    15 => array ( 0 => '0', 1 => '0', 2 => 'Dog P', ), 
    16 => array ( 0 => '14', 1 => '17', 2 => 'Dog Q', ), 
    17 => array ( 0 => '0', 1 => '0', 2 => 'Dog R', ), 
    18 => array ( 0 => '0', 1 => '0', 2 => 'Dog S', ), 
    19 => array ( 0 => '0', 1 => '0', 2 => 'Dog T', ), 
    20 => array ( 0 => '0', 1 => '0', 2 => 'Dog U', ), 
    21 => array ( 0 => '0', 1 => '0', 2 => 'Dog V', ), 
    22 => array ( 0 => '0', 1 => '0', 2 => 'Dog W', ), 
    23 => array ( 0 => '0', 1 => '0', 2 => 'Dog X', ), 
    24 => array ( 0 => '25', 1 => '26', 2 => 'Cedric', ), 
    25 => array ( 0 => '27', 1 => '0', 2 => 'Phantom', ), 
    26 => array ( 0 => '27', 1 => '0', 2 => 'Walton Mare', ), 
    27 => array ( 0 => '0', 1 => '0', 2 => 'Walton', ), 
    28 => array ( 0 => '0', 1 => '0', 2 => 'A', ), 
    29 => array ( 0 => '0', 1 => '0', 2 => 'B', ), 
    30 => array ( 0 => '29', 1 => '28', 2 => 'C', ), 
    31 => array ( 0 => '29', 1 => '28', 2 => 'D', ), 
    32 => array ( 0 => '0', 1 => '30', 2 => 'E', ), 
    33 => array ( 0 => '0', 1 => '31', 2 => 'F', ), 
    34 => array ( 0 => '33', 1 => '32', 2 => 'I', ), 
    35 => array ( 0 => '0', 1 => '0', 2 => 'J', ), 
    36 => array ( 0 => '0', 1 => '0', 2 => 'K', ), 
    37 => array ( 0 => '0', 1 => '0', 2 => 'L', ), 
    38 => array ( 0 => '0', 1 => '0', 2 => 'M', ), 
    39 => array ( 0 => '0', 1 => '0', 2 => 'N', ), 
    40 => array ( 0 => '0', 1 => '0', 2 => 'Dog1', ), 
    41 => array ( 0 => '0', 1 => '0', 2 => 'Dog2', ), 
    42 => array ( 0 => '40', 1 => '41', 2 => 'Dog3', ), 
    43 => array ( 0 => '42', 1 => '41', 2 => 'Dog4', ), 
    44 => array ( 0 => '0', 1 => '0', 2 => 'O', ), 
    45 => array ( 0 => '0', 1 => '0', 2 => 'P', ), 
    46 => array ( 0 => '44', 1 => '45', 2 => 'Q', ), 
    47 => array ( 0 => '44', 1 => '45', 2 => 'R', ), 
    48 => array ( 0 => '46', 1 => '47', 2 => 'S', ), 
    49 => array ( 0 => '46', 1 => '47', 2 => 'T', ), 
    50 => array ( 0 => '48', 1 => '49', 2 => 'U', ), 
    51 => array ( 0 => '0', 1 => '0', 2 => 'A', ), 
    52 => array ( 0 => '0', 1 => '0', 2 => 'B', ), 
    53 => array ( 0 => '51', 1 => '52', 2 => 'C', ), 
    54 => array ( 0 => '51', 1 => '52', 2 => 'D', ), 
    55 => array ( 0 => '51', 1 => '52', 2 => 'E', ), 
    56 => array ( 0 => '51', 1 => '52', 2 => 'G', ), 
    57 => array ( 0 => '53', 1 => '54', 2 => 'H', ), 
    58 => array ( 0 => '55', 1 => '56', 2 => 'I', ), 
    59 => array ( 0 => '57', 1 => '58', 2 => 'J', ), 
    60 => array ( 0 => '59', 1 => '50', 2 => 'Z', )
);

//
// CALCULATE INBREEDING COEFFICIENTS
//
$doglist = [4,9,34,50,59,60];
echo "<pre>\n";
foreach ($doglist as $dogid) {
    printf("%-20s (#%03d)  COI : %0.4f<br>", $dogs[$dogid][2], $dogid, COI($dogid, $dogs));
    
}
echo "</pre>\n";


//
// FUNCTIONS
//

function getAncestors($id, &$dogs, &$ancests, $path)
{   
    if ($id==0) return;

    $ancests[$id][] = $path;
    if (isset($dogs[$id]) ) {
        
        getAncestors($dogs[$id][0], $dogs, $ancests, $path.$dogs[$id][0].',');
        getAncestors($dogs[$id][1], $dogs, $ancests, $path.$dogs[$id][1].',');
    }
}

function COI($id, &$dogs)
{
    if ($id==0) return 0;
    $sires = $dams = [];
    getAncestors($dogs[$id][0], $dogs, $sires, '');
    getAncestors($dogs[$id][1], $dogs, $dams, '');
    $result=0;
    
    foreach ($sires as $did=>$dists) {
        if (isset($dams[$did])) {
            $distd = $dams[$did];
            foreach ($dists as $paths) {
                foreach ($distd as $pathd) {
                    $ds = count(explode(',', $paths));
                    $dd = count(explode(',', $pathd));
                    if ($paths==$pathd && $ds>2) continue;
                    $sumd = $ds + $dd-1;
                    $intermed = pow(0.5, $sumd) * (1 + COI($did, $dogs));
                    $result += $intermed;
                 // printf("| %5s | %8.4f | %12s | %12s |\n", $dogs[$did][2], $intermed, $paths, $pathd);
                }
            }
        }
    }
    return $result;
}

Results

Dog E                (#004)  COI : 0.1875
Dog J                (#009)  COI : 0.3750
I                    (#034)  COI : 0.0625
U                    (#050)  COI : 0.3750
J                    (#059)  COI : 0.2500
Z                    (#060)  COI : 0.0000

Link to comment
Share on other sites

Is there anyway to get the $sires & $dams arrays to properly display like this when necessary?  It looks like it's not tracking all occurrences.

 

DOG ID: 52 

|  ID |      NAME          | SIRE | DAM  |
|     |                    | DIST | DIST |
|-----|--------------------|------|------|
|  44 | A                  |   2,2,2,2|   2,2,2,2|
.5^(4+1) = 0.03125
.5^(4+1) = 0.03125
.5^(4+1) = 0.03125
.5^(4+1) = 0.03125

|  45 | B                  |   2,2,2,2|   2,2,2,2|
.5^(4+1) = 0.03125
.5^(4+1) = 0.03125
.5^(4+1) = 0.03125
.5^(4+1) = 0.03125

total ICO: 0.25

Link to comment
Share on other sites

  • 10 months later...
  • 3 years later...
This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.