1
0
Fork 0
mirror of https://github.com/MillironX/beefblup.git synced 2024-11-10 18:23:08 +00:00
beefblup/Julia/beefblup.jl

120 lines
3.4 KiB
Julia

# beefblup
# Main script for performing single-variate BLUP to find beef cattle
# breeding values
# Usage: julia beefblup.jl
# (C) 2019 Thomas A. Christensen II
# Licensed under BSD-3-Clause License
# Import the required packages
using XLSX
# Display stuff
println("beefblup v 0.0.0.1")
println("(C) 2019 Thomas A. Christensen II")
println("https://github.com/millironx/beefblup")
print("\n")
### Prompt User
# Ask for an input spreadsheet
# print("Enter the full filename of a beefblup worksheet> ")
# path = readline(stdin)
path = "C:\\Users\\cclea\\source\\repos\\beefblup\\Excel\\Master BLUP Worksheet.xlsx"
# Ask for an output text filename
# print("Enter the full filename of your desired results> ")
# savepath = readline(stdin)
savepath = "C:\\Users\\cclea\\source\\repos\\beefblup\\results.txt"
# Ask for heritability
# print("What is the heritability for this trait?> ")
# h2 = parse(Float64, readline(stdin))
h2 = 0.4
### Import input filename
print("[🐮]: Importing Excel file...")
# Import data from a suitable spreadsheet
data = XLSX.readxlsx(path)[1][:]
print("Done!\n")
### Process input file
print("[🐮]: Processing and formatting data ...")
# Extract the headers into a separate array
headers = data[1,:]
data = data[2:end,:]
# Sort the array by date
data = sortslices(data, dims=1, lt=(x,y)->isless(x[2],y[2]))
# Define fields to hold id values for animals and their parents
ids = data[:,1]
damids = data[:,3]
sireids = data[:,4]
numanimals = length(ids)
# Find the index values for animals and their parents
dam = indexin(damids, ids)
sire = indexin(sireids, ids)
# Store column numbers that need to be deleted
# Column 6 contains an intermediate Excel calculation and always need to
# be deleted
colstokeep = [1, 2, 3, 4, 5]
# Find any columns that need to be deleted
for i in 7:length(headers)
if length(unique(data[:,i])) <= 1
colname = headers[i]
print("Column '")
print(colname)
print("' does not have any unique animals and will be removed from this analysis\n")
else
push!(colstokeep, i)
end
end
# Delete the appropriate columns from the datasheet and the headers
data = data[:, colstokeep]
headers = headers[colstokeep]
# Determine how many contemporary groups there are
numgroups = ones(1, length(headers)-5)
for i in 6:length(headers)
numgroups[i-5] = length(unique(data[:,i]))
end
# If there are more groups than animals, then the analysis cannot continue
if sum(numgroups) >= numanimals
println("There are more contemporary groups than animals. The analysis will
now abort.")
exit()
end
# Define a "normal" animal as one of the last in the groups, provided that
# all traits do not have null values
normal = Array{String}(undef,1,length(headers)-5)
for i in 6:length(headers)
for j in numanimals:-1:1
if !ismissing(data[j,i])
normal[i-5] = data[j,i]
break
end
end
end
# Print the results of the "normal" definition
println(" ")
println("For the purposes of this analysis, a 'normal' animal will be defined by")
println("the following traits:")
for i in 6:length(headers)
print(headers[i])
print(": ")
print(normal[i-5])
print("\n")
end
println("If no animal matching this description exists, the results may appear")
println("outlandish, but are still as correct as the accuracy suggests")
print("Done!\n")