In [52]:
using DataFrames
ped = readtable("LICPedigree.seq",separator=' ')
n = size(ped,1)
Out[52]:
In [56]:
aij = Dict{Int64, Float64}()
fArray = fill(-1.0,n)
head(ped)
Out[56]:
In [45]:
function calcAddRel!(aij::Dict{Int64, Float64},ped::DataFrame,id1::Int64,id2::Int64)
if id1==0 || id2==0
return 0.0
end
old,yng = id1<id2 ? (id1,id2):(id2,id1)
n = yng - 1
aijKey = n*(n+1)/2 + old
if haskey(aij,aijKey)
return aij[aijKey]
end
sireOfYng = ped[yng,:sire]
damOfYng = ped[yng,:dam]
if old==yng
aii = 1 + 0.5*calcAddRel!(aij,ped,damOfYng,sireOfYng)
aij[aijKey] = aii
return (aii)
end
aOldDamYoung = (old==0 || damOfYng ==0)? 0.0:calcAddRel!(aij,ped,old,damOfYng)
aOldSireYoung = (old==0 || sireOfYng==0)? 0.0:calcAddRel!(aij,ped,old,sireOfYng)
aijVal = 0.5*(aOldSireYoung + aOldDamYoung)
aij[aijKey] = aijVal
return(aijVal)
end
Out[45]:
In [46]:
function calcInbreeding!(fArray::Array{Float64,1},aij::Dict{Int64, Float64},ped::DataFrame,
id::Int64)
if fArray[id] > -1.0
return fArray[id]
end
sireID = ped[id,:sire]
damID = ped[id,:dam ]
if (sireID==0 || damID==0 )
fArray[id] = 0.0
else
fArray[id] = 0.5*calcAddRel!(aij,ped,sireID,damID)
end
end
Out[46]:
In [47]:
function testSpeed(n,fArray,aij,ped)
for ind in 1:n
calcInbreeding!(fArray,aij,ped,ind)
end
end
Out[47]:
In [57]:
@time testSpeed(n,fArray,aij,ped)
In [58]:
sortrows([fArray ped[:ind]])
Out[58]: