From d4192142b85c0b8543b6b435d3c690ab840f4d56 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Thu, 29 Aug 2019 18:59:13 -0700 Subject: [PATCH 01/25] Added all results files to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b7f3332..6d5306c 100644 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,7 @@ venv.bak/ .mypy_cache/ .dmypy.json dmypy.json + +# Ignore results files +Results.txt +results.txt \ No newline at end of file From e101ff3585a14fc29f090f1cd26566c3867292b3 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Thu, 29 Aug 2019 19:56:14 -0700 Subject: [PATCH 02/25] Added Julius van der Werf's example to test agains --- Excel/van der Werf.xlsx | Bin 0 -> 12285 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Excel/van der Werf.xlsx diff --git a/Excel/van der Werf.xlsx b/Excel/van der Werf.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2cc896006a3e737aa02ca23d007d73c7b2c7a796 GIT binary patch literal 12285 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 t!VpU-tGp;qNKXpM>uy z{~-KJLi9WOuW7=cSO7qj3IO4Kf4gOCruOJQes Date: Fri, 8 Nov 2019 18:33:01 -0800 Subject: [PATCH 03/25] Add Julia stuff to gitignore --- .gitignore | 30 ++++++- .idea/dictionaries/cclea.xml | 9 ++ .idea/workspace.xml | 167 +++++++++++++++++++++++++++++++++++ Julia/install.jl | 3 + 4 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 .idea/dictionaries/cclea.xml create mode 100644 .idea/workspace.xml create mode 100644 Julia/install.jl diff --git a/.gitignore b/.gitignore index 6d5306c..2ed722b 100644 --- a/.gitignore +++ b/.gitignore @@ -201,4 +201,32 @@ dmypy.json # Ignore results files Results.txt -results.txt \ No newline at end of file +results.txt + +### Julia.gitignore +# (https://github.com/github/gitignore/blob/master/Julia.gitignore) + +# Files generated by invoking Julia with --code-coverage +*.jl.cov +*.jl.*.cov + +# Files generated by invoking Julia with --track-allocation +*.jl.mem + +# System-specific files and directories generated by the BinaryProvider and BinDeps packages +# They contain absolute paths specific to the host computer, and so should not be committed +deps/deps.jl +deps/build.log +deps/downloads/ +deps/usr/ +deps/src/ + +# Build artifacts for creating documentation generated by the Documenter package +docs/build/ +docs/site/ + +# File generated by Pkg, the package manager, based on a corresponding Project.toml +# It records a fixed state of all packages used by the project. As such, it should not be +# committed for packages, but should be committed for applications that require a static +# environment. +Manifest.toml \ No newline at end of file diff --git a/.idea/dictionaries/cclea.xml b/.idea/dictionaries/cclea.xml new file mode 100644 index 0000000..8c49cbc --- /dev/null +++ b/.idea/dictionaries/cclea.xml @@ -0,0 +1,9 @@ + + + + beefblup + blup + matlab + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..bbe788f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1567039339175 + + + 1567130353481 + + + 1567131158833 + + + 1567131230009 + + + 1567131261939 + + + 1567133774405 + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/Python/beefblup.py + 44 + + + file://$PROJECT_DIR$/Python/beefblup.py + 59 + + + file://$PROJECT_DIR$/Python/beefblup.py + 71 + + + + + \ No newline at end of file diff --git a/Julia/install.jl b/Julia/install.jl new file mode 100644 index 0000000..396cdc4 --- /dev/null +++ b/Julia/install.jl @@ -0,0 +1,3 @@ + +using Pkg +Pkg.add("XLSXReader") \ No newline at end of file From 22b934dc49869790c280ba25b9907daecdc679d2 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Fri, 8 Nov 2019 18:46:11 -0800 Subject: [PATCH 04/25] Add excel reader dependency to install script --- Julia/install.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Julia/install.jl b/Julia/install.jl index 396cdc4..3276384 100644 --- a/Julia/install.jl +++ b/Julia/install.jl @@ -1,3 +1,12 @@ +# beefblup install +# Prepares the Julia environment for using beefblup by installing the requisite +# packages +# Usage: julia install.jl +# (C) 2019 Thomas A. Christensen II +# Licensed under BSD-3-Clause License +# Import the package manager using Pkg -Pkg.add("XLSXReader") \ No newline at end of file + +# Install requisite packages +Pkg.add("XLSX") \ No newline at end of file From 6ac985fee45f3c24bc8f4ce2994e50b59906e7ee Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Fri, 8 Nov 2019 19:01:46 -0800 Subject: [PATCH 05/25] Complete import section port --- Julia/beefblup.jl | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Julia/beefblup.jl diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl new file mode 100644 index 0000000..f519cf0 --- /dev/null +++ b/Julia/beefblup.jl @@ -0,0 +1,28 @@ +# 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 +print("beefblup v 0.0.0.1\n") +print("(C) 2019 Thomas A. Christensen II\n") +print("https://github.com/millironx/beefblup\n") +print("\n") + +### Prompt User +# Ask for an input spreadsheet +print("Enter the full filename of a beefblup worksheet> ") +path = readline(stdin) + +# Ask for an output text filename +print("Enter the full filename of your desired results> ") +savepath = readline(stdin) + +# Ask for heritability +print("What is the heritability for this trait?> ") +h2 = parse(Float64, readline(stdin)) From 44ec5ae1da4b28895a23a0eb651dbcfa70f3867a Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sat, 14 Dec 2019 09:57:48 -0800 Subject: [PATCH 06/25] Complete through "Processing and formatting" --- Julia/beefblup.jl | 110 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 101 insertions(+), 9 deletions(-) diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl index f519cf0..547cfb4 100644 --- a/Julia/beefblup.jl +++ b/Julia/beefblup.jl @@ -9,20 +9,112 @@ using XLSX # Display stuff -print("beefblup v 0.0.0.1\n") -print("(C) 2019 Thomas A. Christensen II\n") -print("https://github.com/millironx/beefblup\n") +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) +# 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) +# 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)) +# 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") From fc771d338a94dde9db2d8c5ec46372cf342b5a5f Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Mon, 3 Feb 2020 18:11:55 -0800 Subject: [PATCH 07/25] Complete port of beefblup to Julia --- .idea/dictionaries/cclea.xml | 9 -- .idea/workspace.xml | 167 --------------------------- Excel/van der Werf2.xlsx | Bin 0 -> 17061 bytes Julia/beefblup.jl | 217 +++++++++++++++++++++++++++++++---- Julia/install.jl | 3 +- 5 files changed, 194 insertions(+), 202 deletions(-) delete mode 100644 .idea/dictionaries/cclea.xml delete mode 100644 .idea/workspace.xml create mode 100644 Excel/van der Werf2.xlsx diff --git a/.idea/dictionaries/cclea.xml b/.idea/dictionaries/cclea.xml deleted file mode 100644 index 8c49cbc..0000000 --- a/.idea/dictionaries/cclea.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - beefblup - blup - matlab - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index bbe788f..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1567039339175 - - - 1567130353481 - - - 1567131158833 - - - 1567131230009 - - - 1567131261939 - - - 1567133774405 - - - - - - - - - - - - - - - - - file://$PROJECT_DIR$/Python/beefblup.py - 44 - - - file://$PROJECT_DIR$/Python/beefblup.py - 59 - - - file://$PROJECT_DIR$/Python/beefblup.py - 71 - - - - - \ No newline at end of file diff --git a/Excel/van der Werf2.xlsx b/Excel/van der Werf2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e7884259d4fbad99a212e383d2c813d83960595d GIT binary patch literal 17061 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 Kb1HcM>;C{s!H#VJ literal 0 HcmV?d00001 diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl index 547cfb4..16c0c6e 100644 --- a/Julia/beefblup.jl +++ b/Julia/beefblup.jl @@ -7,6 +7,9 @@ # Import the required packages using XLSX +using LinearAlgebra +using Dates +using Gtk # Display stuff println("beefblup v 0.0.0.1") @@ -16,19 +19,23 @@ 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" +path = open_dialog_native( + "Select a beefblup worksheet", + GtkNullContainer(), + ("*.xlsx", GtkFileFilter("*.xlsx", name="beefblup worksheet")) +) # 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" +savepath = save_dialog_native( + "Save your beefblup results", + GtkNullContainer(), + (GtkFileFilter("*.txt", name="Results file"), + "*.txt") +) # Ask for heritability -# print("What is the heritability for this trait?> ") -# h2 = parse(Float64, readline(stdin)) -h2 = 0.4 +print("What is the heritability for this trait?> ") +h2 = parse(Float64, readline(stdin)) ### Import input filename print("[🐮]: Importing Excel file...") @@ -39,7 +46,7 @@ data = XLSX.readxlsx(path)[1][:] print("Done!\n") ### Process input file -print("[🐮]: Processing and formatting data ...") +print("[🐮]: Processing and formatting data...") # Extract the headers into a separate array headers = data[1,:] @@ -49,9 +56,9 @@ data = data[2:end,:] 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] +ids = string.(data[:,1]) +damids = string.(data[:,3]) +sireids = string.(data[:,4]) numanimals = length(ids) # Find the index values for animals and their parents @@ -98,23 +105,183 @@ 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] + normal[i-5] = string(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") +print("Done!\n") + +### Create the fixed-effect matrix +print("[🐮]: Creating the fixed-effect matrix...") + +# Form the fixed-effect matrix +X = zeros(Int8, numanimals, floor(Int,sum(numgroups))-length(numgroups)+1) +X[:,1] = ones(Int8, 1, numanimals) + +# Create an external counter that will increment through both loops +counter = 2 + +# Store the traits in a string array +adjustedtraits = +Array{String}(undef,floor(Int,sum(numgroups))-length(numgroups)) +# Iterate through each group +for i in 1:length(normal) + # Find the traits that are present in this trait + localdata = string.(data[:,i+5]) + traits = unique(localdata) + # Remove the normal version from the analysis + effecttraits = traits[findall(x -> x != normal[i], traits)] + # Iterate inside of the group + for j in 1:length(effecttraits) + matchedindex = findall(x -> x != effecttraits[j], localdata) + X[matchedindex, counter] .= 1 + # Add this trait to the string + adjustedtraits[counter - 1] = traits[j] + # Increment the big counter + global counter = counter + 1 + end 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") + +### Additive relationship matrix +print("[🐮]: Creating additive relationship matrix...") + +# Create an empty matrix for the additive relationship matrix +A = zeros(numanimals, numanimals) + +# Create the additive relationship matrix by the FORTRAN method presented by +# Henderson +for i in 1:numanimals + if !isnothing(dam[i]) && !isnothing(sire[i]) + for j in 1:(i-1) + A[j,i] = 0.5*(A[j,sire[i]] + A[j,dam[i]]) + A[i,j] = A[j,i] + end + A[i,i] = 1 + 0.5*A[sire[i], dam[i]] + elseif !isnothing(dam[i]) && isnothing(sire[i]) + for j in 1:(i-1) + A[j,i] = 0.5*A[j,dam[i]] + A[i,j] = A[j,i] + end + A[i,i] = 1 + elseif isnothing(dam[i]) && !isnothing(sire[i]) + for j in 1:(i-1) + A[j,i] = 0.5*A[j,sire[i]] + A[i,j] = A[j,i] + end + A[i,i] = 1 + else + for j in 1:(i-1) + A[j,i] = 0 + A[i,j] = 0 + end + A[i,i] = 1 + end +end + +print("Done!\n") + +### Perform BLUP +print("[🐮]: Solving the mixed-model equations...") + +# Extract the observed data +Y = convert(Array{Float64}, data[:,5]) + +# The random effects matrix +Z = Matrix{Int}(I, numanimals, numanimals) + +# Remove items where there is no data +nullobs = findall(isnothing, Y) +Z[nullobs, nullobs] .= 0 + +# Calculate heritability +λ = (1-h2)/h2 + +# Use the mixed-model equations +MME = [X'*X X'*Z; Z'*X (Z'*Z)+(inv(A).*λ)] +MMY = [X'*Y; Z'*Y] +solutions = MME\MMY + +# Find the accuracies +diaginv = diag(inv(MME)) +reliability = ones(Float64, length(diaginv)) - diaginv.*λ + +print("Done!\n") + +### Output the results +print("[🐮]: Saving results...") + +# Find how many traits we found BLUE for +numgroups = numgroups .- 1 + +# Start printing results to output +fileID = open(savepath, "w") +write(fileID, "beefblup Results Report\n") +write(fileID, "Produced using beefblup for Julia (") +write(fileID, "https://github.com/millironx/beefblup") +write(fileID, ")\n\n") +write(fileID, "Input:\t") +write(fileID, path) +write(fileID, "\nAnalysis performed:\t") +write(fileID, string(Dates.today())) +write(fileID, "\nTrait examined:\t") +write(fileID, headers[5]) +write(fileID, "\n\n") + +# Print base population stats +write(fileID, "Base Population:\n") +for i in 1:length(numgroups) + write(fileID, "\t") + write(fileID, headers[i+5]) + write(fileID, ":\t") + write(fileID, normal[i]) + write(fileID, "\n") +end +write(fileID, "\tMean ") +write(fileID, headers[5]) +write(fileID, ":\t") +write(fileID, string(solutions[1])) +write(fileID, "\n\n") + +# Contemporary group adjustments +counter = 2 +write(fileID, "Contemporary Group Effects:\n") +for i in 1:length(numgroups) + write(fileID, "\t") + write(fileID, headers[i+5]) + write(fileID, "\tEffect\tReliability\n") + for j in 1:numgroups[i] + write(fileID, "\t") + write(fileID, adjustedtraits[counter - 1]) + write(fileID, "\t") + write(fileID, string(solutions[counter])) + write(fileID, "\t") + write(fileID, string(reliability[counter])) + write(fileID, "\n") + + global counter = counter + 1 + end + write(fileID, "\n") +end +write(fileID, "\n") + +# Expected breeding values +write(fileID, "Expected Breeding Values:\n") +write(fileID, "\tID\tEBV\tReliability\n") +for i in 1:numanimals + write(fileID, "\t") + write(fileID, ids[i]) + write(fileID, "\t") + write(fileID, string(solutions[i+counter-1])) + write(fileID, "\t") + write(fileID, string(reliability[i+counter-1])) + write(fileID, "\n") +end + +write(fileID, "\n - END REPORT -") +close(fileID) print("Done!\n") diff --git a/Julia/install.jl b/Julia/install.jl index 3276384..1a3698d 100644 --- a/Julia/install.jl +++ b/Julia/install.jl @@ -9,4 +9,5 @@ using Pkg # Install requisite packages -Pkg.add("XLSX") \ No newline at end of file +Pkg.add("XLSX") +Pkg.add("Gtk") \ No newline at end of file From 6e7dee375cabe353c367243b8f94d021f6abe281 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Thu, 29 Aug 2019 18:59:13 -0700 Subject: [PATCH 08/25] Added all results files to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b7f3332..6d5306c 100644 --- a/.gitignore +++ b/.gitignore @@ -198,3 +198,7 @@ venv.bak/ .mypy_cache/ .dmypy.json dmypy.json + +# Ignore results files +Results.txt +results.txt \ No newline at end of file From ea7e6199a776b2fdf95dcd152f28420a93a0d8b0 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Thu, 29 Aug 2019 19:56:14 -0700 Subject: [PATCH 09/25] Added Julius van der Werf's example to test agains --- Excel/van der Werf.xlsx | Bin 0 -> 12285 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Excel/van der Werf.xlsx diff --git a/Excel/van der Werf.xlsx b/Excel/van der Werf.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2cc896006a3e737aa02ca23d007d73c7b2c7a796 GIT binary patch literal 12285 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 t!VpU-tGp;qNKXpM>uy z{~-KJLi9WOuW7=cSO7qj3IO4Kf4gOCruOJQes Date: Fri, 8 Nov 2019 18:33:01 -0800 Subject: [PATCH 10/25] Add Julia stuff to gitignore --- .gitignore | 30 ++++++- .idea/dictionaries/cclea.xml | 9 ++ .idea/workspace.xml | 167 +++++++++++++++++++++++++++++++++++ Julia/install.jl | 3 + 4 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 .idea/dictionaries/cclea.xml create mode 100644 .idea/workspace.xml create mode 100644 Julia/install.jl diff --git a/.gitignore b/.gitignore index 6d5306c..2ed722b 100644 --- a/.gitignore +++ b/.gitignore @@ -201,4 +201,32 @@ dmypy.json # Ignore results files Results.txt -results.txt \ No newline at end of file +results.txt + +### Julia.gitignore +# (https://github.com/github/gitignore/blob/master/Julia.gitignore) + +# Files generated by invoking Julia with --code-coverage +*.jl.cov +*.jl.*.cov + +# Files generated by invoking Julia with --track-allocation +*.jl.mem + +# System-specific files and directories generated by the BinaryProvider and BinDeps packages +# They contain absolute paths specific to the host computer, and so should not be committed +deps/deps.jl +deps/build.log +deps/downloads/ +deps/usr/ +deps/src/ + +# Build artifacts for creating documentation generated by the Documenter package +docs/build/ +docs/site/ + +# File generated by Pkg, the package manager, based on a corresponding Project.toml +# It records a fixed state of all packages used by the project. As such, it should not be +# committed for packages, but should be committed for applications that require a static +# environment. +Manifest.toml \ No newline at end of file diff --git a/.idea/dictionaries/cclea.xml b/.idea/dictionaries/cclea.xml new file mode 100644 index 0000000..8c49cbc --- /dev/null +++ b/.idea/dictionaries/cclea.xml @@ -0,0 +1,9 @@ + + + + beefblup + blup + matlab + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..bbe788f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1567039339175 + + + 1567130353481 + + + 1567131158833 + + + 1567131230009 + + + 1567131261939 + + + 1567133774405 + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/Python/beefblup.py + 44 + + + file://$PROJECT_DIR$/Python/beefblup.py + 59 + + + file://$PROJECT_DIR$/Python/beefblup.py + 71 + + + + + \ No newline at end of file diff --git a/Julia/install.jl b/Julia/install.jl new file mode 100644 index 0000000..396cdc4 --- /dev/null +++ b/Julia/install.jl @@ -0,0 +1,3 @@ + +using Pkg +Pkg.add("XLSXReader") \ No newline at end of file From a0b1aefc18a5ad98a6fb165e0d2ae2ccdd1debe3 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Fri, 8 Nov 2019 18:46:11 -0800 Subject: [PATCH 11/25] Add excel reader dependency to install script --- Julia/install.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Julia/install.jl b/Julia/install.jl index 396cdc4..3276384 100644 --- a/Julia/install.jl +++ b/Julia/install.jl @@ -1,3 +1,12 @@ +# beefblup install +# Prepares the Julia environment for using beefblup by installing the requisite +# packages +# Usage: julia install.jl +# (C) 2019 Thomas A. Christensen II +# Licensed under BSD-3-Clause License +# Import the package manager using Pkg -Pkg.add("XLSXReader") \ No newline at end of file + +# Install requisite packages +Pkg.add("XLSX") \ No newline at end of file From 7e689b584128b6d8d8ecdcdf2a191d4b76ce9971 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Fri, 8 Nov 2019 19:01:46 -0800 Subject: [PATCH 12/25] Complete import section port --- Julia/beefblup.jl | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Julia/beefblup.jl diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl new file mode 100644 index 0000000..f519cf0 --- /dev/null +++ b/Julia/beefblup.jl @@ -0,0 +1,28 @@ +# 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 +print("beefblup v 0.0.0.1\n") +print("(C) 2019 Thomas A. Christensen II\n") +print("https://github.com/millironx/beefblup\n") +print("\n") + +### Prompt User +# Ask for an input spreadsheet +print("Enter the full filename of a beefblup worksheet> ") +path = readline(stdin) + +# Ask for an output text filename +print("Enter the full filename of your desired results> ") +savepath = readline(stdin) + +# Ask for heritability +print("What is the heritability for this trait?> ") +h2 = parse(Float64, readline(stdin)) From 24949f605f0698bebf81ae1444ad70746c69265f Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sat, 14 Dec 2019 09:57:48 -0800 Subject: [PATCH 13/25] Complete through "Processing and formatting" --- Julia/beefblup.jl | 110 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 101 insertions(+), 9 deletions(-) diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl index f519cf0..547cfb4 100644 --- a/Julia/beefblup.jl +++ b/Julia/beefblup.jl @@ -9,20 +9,112 @@ using XLSX # Display stuff -print("beefblup v 0.0.0.1\n") -print("(C) 2019 Thomas A. Christensen II\n") -print("https://github.com/millironx/beefblup\n") +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) +# 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) +# 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)) +# 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") From 3a440603348306c9fb064be71d28f5de1730a097 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Mon, 3 Feb 2020 18:11:55 -0800 Subject: [PATCH 14/25] Complete port of beefblup to Julia --- .idea/dictionaries/cclea.xml | 9 -- .idea/workspace.xml | 167 --------------------------- Excel/van der Werf2.xlsx | Bin 0 -> 17061 bytes Julia/beefblup.jl | 217 +++++++++++++++++++++++++++++++---- Julia/install.jl | 3 +- 5 files changed, 194 insertions(+), 202 deletions(-) delete mode 100644 .idea/dictionaries/cclea.xml delete mode 100644 .idea/workspace.xml create mode 100644 Excel/van der Werf2.xlsx diff --git a/.idea/dictionaries/cclea.xml b/.idea/dictionaries/cclea.xml deleted file mode 100644 index 8c49cbc..0000000 --- a/.idea/dictionaries/cclea.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - beefblup - blup - matlab - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index bbe788f..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1567039339175 - - - 1567130353481 - - - 1567131158833 - - - 1567131230009 - - - 1567131261939 - - - 1567133774405 - - - - - - - - - - - - - - - - - file://$PROJECT_DIR$/Python/beefblup.py - 44 - - - file://$PROJECT_DIR$/Python/beefblup.py - 59 - - - file://$PROJECT_DIR$/Python/beefblup.py - 71 - - - - - \ No newline at end of file diff --git a/Excel/van der Werf2.xlsx b/Excel/van der Werf2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e7884259d4fbad99a212e383d2c813d83960595d GIT binary patch literal 17061 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 Kb1HcM>;C{s!H#VJ literal 0 HcmV?d00001 diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl index 547cfb4..16c0c6e 100644 --- a/Julia/beefblup.jl +++ b/Julia/beefblup.jl @@ -7,6 +7,9 @@ # Import the required packages using XLSX +using LinearAlgebra +using Dates +using Gtk # Display stuff println("beefblup v 0.0.0.1") @@ -16,19 +19,23 @@ 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" +path = open_dialog_native( + "Select a beefblup worksheet", + GtkNullContainer(), + ("*.xlsx", GtkFileFilter("*.xlsx", name="beefblup worksheet")) +) # 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" +savepath = save_dialog_native( + "Save your beefblup results", + GtkNullContainer(), + (GtkFileFilter("*.txt", name="Results file"), + "*.txt") +) # Ask for heritability -# print("What is the heritability for this trait?> ") -# h2 = parse(Float64, readline(stdin)) -h2 = 0.4 +print("What is the heritability for this trait?> ") +h2 = parse(Float64, readline(stdin)) ### Import input filename print("[🐮]: Importing Excel file...") @@ -39,7 +46,7 @@ data = XLSX.readxlsx(path)[1][:] print("Done!\n") ### Process input file -print("[🐮]: Processing and formatting data ...") +print("[🐮]: Processing and formatting data...") # Extract the headers into a separate array headers = data[1,:] @@ -49,9 +56,9 @@ data = data[2:end,:] 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] +ids = string.(data[:,1]) +damids = string.(data[:,3]) +sireids = string.(data[:,4]) numanimals = length(ids) # Find the index values for animals and their parents @@ -98,23 +105,183 @@ 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] + normal[i-5] = string(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") +print("Done!\n") + +### Create the fixed-effect matrix +print("[🐮]: Creating the fixed-effect matrix...") + +# Form the fixed-effect matrix +X = zeros(Int8, numanimals, floor(Int,sum(numgroups))-length(numgroups)+1) +X[:,1] = ones(Int8, 1, numanimals) + +# Create an external counter that will increment through both loops +counter = 2 + +# Store the traits in a string array +adjustedtraits = +Array{String}(undef,floor(Int,sum(numgroups))-length(numgroups)) +# Iterate through each group +for i in 1:length(normal) + # Find the traits that are present in this trait + localdata = string.(data[:,i+5]) + traits = unique(localdata) + # Remove the normal version from the analysis + effecttraits = traits[findall(x -> x != normal[i], traits)] + # Iterate inside of the group + for j in 1:length(effecttraits) + matchedindex = findall(x -> x != effecttraits[j], localdata) + X[matchedindex, counter] .= 1 + # Add this trait to the string + adjustedtraits[counter - 1] = traits[j] + # Increment the big counter + global counter = counter + 1 + end 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") + +### Additive relationship matrix +print("[🐮]: Creating additive relationship matrix...") + +# Create an empty matrix for the additive relationship matrix +A = zeros(numanimals, numanimals) + +# Create the additive relationship matrix by the FORTRAN method presented by +# Henderson +for i in 1:numanimals + if !isnothing(dam[i]) && !isnothing(sire[i]) + for j in 1:(i-1) + A[j,i] = 0.5*(A[j,sire[i]] + A[j,dam[i]]) + A[i,j] = A[j,i] + end + A[i,i] = 1 + 0.5*A[sire[i], dam[i]] + elseif !isnothing(dam[i]) && isnothing(sire[i]) + for j in 1:(i-1) + A[j,i] = 0.5*A[j,dam[i]] + A[i,j] = A[j,i] + end + A[i,i] = 1 + elseif isnothing(dam[i]) && !isnothing(sire[i]) + for j in 1:(i-1) + A[j,i] = 0.5*A[j,sire[i]] + A[i,j] = A[j,i] + end + A[i,i] = 1 + else + for j in 1:(i-1) + A[j,i] = 0 + A[i,j] = 0 + end + A[i,i] = 1 + end +end + +print("Done!\n") + +### Perform BLUP +print("[🐮]: Solving the mixed-model equations...") + +# Extract the observed data +Y = convert(Array{Float64}, data[:,5]) + +# The random effects matrix +Z = Matrix{Int}(I, numanimals, numanimals) + +# Remove items where there is no data +nullobs = findall(isnothing, Y) +Z[nullobs, nullobs] .= 0 + +# Calculate heritability +λ = (1-h2)/h2 + +# Use the mixed-model equations +MME = [X'*X X'*Z; Z'*X (Z'*Z)+(inv(A).*λ)] +MMY = [X'*Y; Z'*Y] +solutions = MME\MMY + +# Find the accuracies +diaginv = diag(inv(MME)) +reliability = ones(Float64, length(diaginv)) - diaginv.*λ + +print("Done!\n") + +### Output the results +print("[🐮]: Saving results...") + +# Find how many traits we found BLUE for +numgroups = numgroups .- 1 + +# Start printing results to output +fileID = open(savepath, "w") +write(fileID, "beefblup Results Report\n") +write(fileID, "Produced using beefblup for Julia (") +write(fileID, "https://github.com/millironx/beefblup") +write(fileID, ")\n\n") +write(fileID, "Input:\t") +write(fileID, path) +write(fileID, "\nAnalysis performed:\t") +write(fileID, string(Dates.today())) +write(fileID, "\nTrait examined:\t") +write(fileID, headers[5]) +write(fileID, "\n\n") + +# Print base population stats +write(fileID, "Base Population:\n") +for i in 1:length(numgroups) + write(fileID, "\t") + write(fileID, headers[i+5]) + write(fileID, ":\t") + write(fileID, normal[i]) + write(fileID, "\n") +end +write(fileID, "\tMean ") +write(fileID, headers[5]) +write(fileID, ":\t") +write(fileID, string(solutions[1])) +write(fileID, "\n\n") + +# Contemporary group adjustments +counter = 2 +write(fileID, "Contemporary Group Effects:\n") +for i in 1:length(numgroups) + write(fileID, "\t") + write(fileID, headers[i+5]) + write(fileID, "\tEffect\tReliability\n") + for j in 1:numgroups[i] + write(fileID, "\t") + write(fileID, adjustedtraits[counter - 1]) + write(fileID, "\t") + write(fileID, string(solutions[counter])) + write(fileID, "\t") + write(fileID, string(reliability[counter])) + write(fileID, "\n") + + global counter = counter + 1 + end + write(fileID, "\n") +end +write(fileID, "\n") + +# Expected breeding values +write(fileID, "Expected Breeding Values:\n") +write(fileID, "\tID\tEBV\tReliability\n") +for i in 1:numanimals + write(fileID, "\t") + write(fileID, ids[i]) + write(fileID, "\t") + write(fileID, string(solutions[i+counter-1])) + write(fileID, "\t") + write(fileID, string(reliability[i+counter-1])) + write(fileID, "\n") +end + +write(fileID, "\n - END REPORT -") +close(fileID) print("Done!\n") diff --git a/Julia/install.jl b/Julia/install.jl index 3276384..1a3698d 100644 --- a/Julia/install.jl +++ b/Julia/install.jl @@ -9,4 +9,5 @@ using Pkg # Install requisite packages -Pkg.add("XLSX") \ No newline at end of file +Pkg.add("XLSX") +Pkg.add("Gtk") \ No newline at end of file From 3812cc1ac551bc30c46e939f4319bccb7de20fc7 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Tue, 4 Feb 2020 12:55:14 -0800 Subject: [PATCH 15/25] Remove blocking auto-calculations from van der Werf.xlsx --- Excel/van der Werf.xlsx | Bin 12285 -> 17061 bytes Excel/van der Werf2.xlsx | Bin 17061 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Excel/van der Werf2.xlsx diff --git a/Excel/van der Werf.xlsx b/Excel/van der Werf.xlsx index 2cc896006a3e737aa02ca23d007d73c7b2c7a796..e7884259d4fbad99a212e383d2c813d83960595d 100644 GIT binary patch delta 11411 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 Kb1HcM>;C{s!H#VJ From e3f299d0300fa5011294e009c6df4fd3f3e401c5 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sat, 15 Feb 2020 20:28:49 -0800 Subject: [PATCH 16/25] Remove copy of Excel file left over after merge conflict --- Excel/van der Werf2.xlsx | Bin 17061 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Excel/van der Werf2.xlsx diff --git a/Excel/van der Werf2.xlsx b/Excel/van der Werf2.xlsx deleted file mode 100644 index e7884259d4fbad99a212e383d2c813d83960595d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17061 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 Kb1HcM>;C{s!H#VJ From 56e78851fc0d474d9ba6d0950a9bffee95131823 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sun, 16 Feb 2020 14:45:39 -0800 Subject: [PATCH 17/25] Start README revisions --- README.md | 84 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 265ca4f..99799c4 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,59 @@ -# beefblup +# [:cow:]: beefblup -:cow: :cow: :cow: +beefblup is an easy-to-use program for ranchers to calculate expected breeding +values (EBVs) for their own beef cattle. Why? It's part of my effort to +**\#KeepEPDsReal** -#### \#KeepEPDsReal +> **Notice:** beefblup for MATLAB and beefblup for Python are going away. I'm +> going to make changes here soon that will break the MATLAB version of +> beefblup, and I don't intend to update it anymore. (How many ranchers do you +> know that can afford MATLAB?) As for beefblup for Python, it never really got +> off the ground, and beefblup for Julia has superceded it. -MATLAB and Python scripts and Excel spreadsheets that can be used in conjunction to find breeding values for beef cattle. +## For Users + +### Installation + +#### Windows (My Platform) + +1. Press the **Windows Key** + **X**, and then press **A**, and select **Yes** +2. [Install Chocolatey](https://chocolatey.org/install) using the PowerShell + window that opened +3. Close PowerShell +4. Press the **Windows Key** + **X**, and then press **A**, and select **Yes** + (Again) +5. Type `choco install Julia -y` into PowerShell and press **Enter** +6. Close PowerShell once Chocolatey has finished +7. Download and unzip beefblup to somewhere you will remember it +8. Hold down the **Shift** key, and **right-click** in a blank space in the + "Julia" folder of beefblup +9. Click **Open PowerShell window here" +10. Type `julia install.jl` into PowerShell and press **Enter** +11. Close PowerShell once Julia has finished + +Why do you need Chocolatey? Because it allows you to access Julia (and therefore +beefblup) from the **Shift**+**Right-click** menu directly, without having to +worry about `cd` commands or editing your `%PATH%`. That's good, right? + +#### Mac + +I don't know. I can't afford one. If any of you super-privileged Apple snobs +out there run beefblup, please add proper instructions here and submit a pull +request. + +#### Debian/Ubuntu Linux + +TODO: Add instructions here. This is slightly complicated since there is no +Julia package in the main repositories, and I don't use Debian distros enough to +know where to find a third-party repos + +#### Fedora Linux + +TODO: Add instructions here. I have this info, but it's on the work computer. ## How to Use -1. Download the [Excel template](https://github.com/MillironX/beefblup/raw/master/Excel/Master%20BLUP%20Worksheet.xlsx) +1. Choose a spreadsheet appropriate to the trait you want to analyze from the `Excel` folder, and save it to your hard drive 2. Place your data into the structure described by the spreadsheet 3. If you wish to add more contemporary group traits to your analysis, replace or add them to the right of the Purple section 4. Open MATLAB @@ -20,17 +65,32 @@ MATLAB and Python scripts and Excel spreadsheets that can be used in conjunction cd beefblup-master/MATLAB beefblup ``` - + 6. Select the spreadsheet file you just placed your data into 7. Select a file that you would like to save your results to 8. Breeding values and contemporary group adjustments will be outputted to the file you selected -## Contributing +## For Programmers -I will gladly accept pull requests that acomplish any of the following: +### Development Roadmap -* Convert MATLAB scripts to Python - * The product must be able to be run from the native (non-python) terminal using only the default [Anaconda Python packages](https://anaconda.com/distribution) +| Version | Feature | +| ------- | ------------------------------------------------------------------- | +| v0.1 | Julia port of original MATLAB script | +| v0.2 | Spreadsheet format redesign | +| v0.3 | API rewrite (change to function calls instead of script running) | +| v0.4 | Add GUI for all options | +| v0.5 | Automatically calculated Age-Of-Dam, Year, and Season fixed-effects | +| v0.6 | Repeated measurement BLUP (aka dairyblup) | +| v0.7 | Multiple trait BLUP | +| v0.8 | Maternal effects BLUP | +| v0.9 | Genomic BLUP | +| v0.10 | beefblup binaries | +| v1.0 | [Finally, RELEASE!!!](https://youtu.be/Zd-up5EgoMw?t=5049) | + +I will gladly take input on the following: + +* Converting MATLAB scripts to Python * Optimizing code sections * Use triagonal shortcuts to generate the additive relationship matrix * Solve implicit forms of the mixed-model equation @@ -43,7 +103,7 @@ I will gladly accept pull requests that acomplish any of the following: * Creation of spreadsheets for additional traits * Creation of wiki pages to explain what each script does * The general rule is that **every** wiki page should be understandable to anyone who's passed high school algebra, while still being correct and informative - + Note that I intend to implement all of the items above eventually, but progress is slow since I'm learning as I go. @@ -55,8 +115,6 @@ If you are writing code, please keep the code clean: * For MATLAB, functions go in a separate file * Comments go before a code block: no inline comments -Bug reports and suggestions will be gladly taken on the [issues](https://github.com/MillironX/beefblup/issues) page. There is no set format for issues, yet, but please at the minimum attach a filled-out spreadsheet that demonstrates your bug or how your suggestion would be useful. - ## License Distributed under the 3-Clause BSD License From f83c1b44bb7903b61ecaa809adf33ba22372a6f3 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sun, 16 Feb 2020 15:46:32 -0800 Subject: [PATCH 18/25] More work on README --- README.md | 154 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 108 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 99799c4..06763d6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,13 @@ # [:cow:]: beefblup -beefblup is an easy-to-use program for ranchers to calculate expected breeding -values (EBVs) for their own beef cattle. Why? It's part of my effort to +beefblup is a program for ranchers to calculate expected breeding +values (EBVs) for their own beef cattle. It is intended to be usable by anyone +without requiring any prior knowledge of computer programming or linear algebra. +Why? It's part of my effort to **\#KeepEPDsReal** +[:arrow_down_small: Download beefblup](https://github.com/MillironX/beefblup/archive/master.zip) + > **Notice:** beefblup for MATLAB and beefblup for Python are going away. I'm > going to make changes here soon that will break the MATLAB version of > beefblup, and I don't intend to update it anymore. (How many ranchers do you @@ -24,7 +28,8 @@ values (EBVs) for their own beef cattle. Why? It's part of my effort to (Again) 5. Type `choco install Julia -y` into PowerShell and press **Enter** 6. Close PowerShell once Chocolatey has finished -7. Download and unzip beefblup to somewhere you will remember it +7. [Download beefblup](https://github.com/MillironX/beefblup/archive/master.zip) + and unzip it to somewhere you will remember it 8. Hold down the **Shift** key, and **right-click** in a blank space in the "Julia" folder of beefblup 9. Click **Open PowerShell window here" @@ -37,9 +42,28 @@ worry about `cd` commands or editing your `%PATH%`. That's good, right? #### Mac -I don't know. I can't afford one. If any of you super-privileged Apple snobs -out there run beefblup, please add proper instructions here and submit a pull -request. +1. [Download and install Julia](https://julialang.org/downloads/) +2. Open terminal.app, and run the following + +```bash +curl https://github.com/MillironX/beefblup/archive/master.zip -o beefblup.zip +unzip beefblup.zip +rm beefblup.zip +``` + +3. Quit terminal.app +4. Open julia.app, and run the following + +```julia +cd("~/beefblup/beefblup-master/Julia") +include("install.jl") +``` + +5. Quit julia.app + +I don't know if these are right, since I can't afford a Mac. If any of you +super-privileged Apple snobs out there use beefblup, please add proper +instructions here and submit a pull request. #### Debian/Ubuntu Linux @@ -47,28 +71,76 @@ TODO: Add instructions here. This is slightly complicated since there is no Julia package in the main repositories, and I don't use Debian distros enough to know where to find a third-party repos -#### Fedora Linux +#### Fedora Linux (The best platform) -TODO: Add instructions here. I have this info, but it's on the work computer. +From a new terminal, run -## How to Use +```bash +sudo dnf install julia -y +wget https://github.com/MillironX/beefblup/archive/master.zip -O beefblup.zip +unzip beefblup.zip +rm beefblup.zip +cd beefblup/beefblup-master/Julia +julia install.jl +exit +``` -1. Choose a spreadsheet appropriate to the trait you want to analyze from the `Excel` folder, and save it to your hard drive -2. Place your data into the structure described by the spreadsheet -3. If you wish to add more contemporary group traits to your analysis, replace or add them to the right of the Purple section -4. Open MATLAB -5. Enter the following lines in the command window: +#### Other Platforms - ``` - websave('beefblup.zip','https://github.com/MillironX/beefblup/archive/master.zip'); - unzip('beefblup.zip'); - cd beefblup-master/MATLAB - beefblup - ``` +Seriously? If you're enough of a geek to be using something else, you can figure +this out on your own. -6. Select the spreadsheet file you just placed your data into -7. Select a file that you would like to save your results to -8. Breeding values and contemporary group adjustments will be outputted to the file you selected +### How to Use + +> **Note:** beefblup and [Juno](https://junolab.org)/[Julia Pro](https://juliacomputing.com/products/juliapro.html) currently don't get along. +> Although it's tempting to just open up beefblup in Juno and press the big play +> button, it won't work. Follow these instructions until it's fixed. If you +> don't know what Juno is: ignore this message. + +#### All platforms + +1. Download the [Excel template](https://github.com/MillironX/beefblup/raw/master/Excel/Master%20BLUP%20Worksheet.xlsx) +2. Replace the sample data in the spreadsheet with your own +3. If you wish to add more contemporary group traits to your analysis, replace + or add them to the right of the Purple section +4. Save, and continue with your platform-specific instructions below + +#### Windows + +5. Remember where you downloaded beefblup to when you installed it +6. Hold down the **Shift** key, and **right-click** in a blank space in the + "Julia" folder of beefblup +7. Click **Open PowerShell window here" +8. Type `julia beefblup.jl` into PowerShell and press **Enter** +9. Select the spreadsheet you created in Step 4 +10. Follow the on-screen prompts +11. **\#KeepEPDsReal!** + +#### Mac + +5. Open julia.app, and run the following + +```julia +cd("~/beefblup/beefblup-master/Julia") +include("beefblup.jl") +``` + +6. Select the spreadsheet you created in Step 4 +7. Follow the on-screen prompts +8. **\#KeepEPDsReal!** + +#### All Linux + +5. Open a new terminal, and type + +```bash +cd beefblup/beefblup-master/Julia +julia beefblup.jl +``` + +6. Select the spreadsheet you created in Step 4 +7. Follow the on-screen prompts +8. **\#KeepEPDsReal!** ## For Programmers @@ -86,34 +158,24 @@ TODO: Add instructions here. I have this info, but it's on the work computer. | v0.8 | Maternal effects BLUP | | v0.9 | Genomic BLUP | | v0.10 | beefblup binaries | -| v1.0 | [Finally, RELEASE!!!](https://youtu.be/Zd-up5EgoMw?t=5049) | +| v1.0 | [Finally, RELEASE!!!](https://youtu.be/1CBjxGdgC1w?t=282) | -I will gladly take input on the following: +### Bug Reports -* Converting MATLAB scripts to Python -* Optimizing code sections - * Use triagonal shortcuts to generate the additive relationship matrix - * Solve implicit forms of the mixed-model equation - * Perform cannonical transformations for missing values - * Other similar improvements that I might not be aware of -* Creation of scripts to handle additional forms of BLUP - * Mult-trait (MBLUP) - * Maternal-trait - * Genomic-enhanced (GBLUP) - this will require the creation of a standard SNP spreadsheet format -* Creation of spreadsheets for additional traits -* Creation of wiki pages to explain what each script does - * The general rule is that **every** wiki page should be understandable to anyone who's passed high school algebra, while still being correct and informative +For every bug report, please include at least the following: +- Platform (Windows, Mac, Fedora, etc) +- Julia version +- beefblup version +- How you are running Julia (From PowerShell, via the REPL, etc.) +- A beefblup spreadsheet that can be used to recreate the issue +- Description of the problem +- Expected behavior +- A screenshot and/or REPL printout +### Feature and Pull Requests -Note that I intend to implement all of the items above eventually, but progress is slow since I'm learning as I go. - -If you are writing code, please keep the code clean: - -* Run "Smart Indent" in the MATLAB editor on the entire file before checking it in -* Name variables in full word English using all lowercase, unless the matrix name is generally agreed upon in academic papers (i.e. A is the additive relationship matrix) -* For MATLAB, functions go in a separate file -* Comments go before a code block: no inline comments +Although I doubt there will be many contributors here, ## License From 88ebbb2969132c81715f03aeba72021a2c34893d Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sun, 16 Feb 2020 15:56:01 -0800 Subject: [PATCH 19/25] Remove AOD from worksheet --- Excel/Master BLUP Worksheet.xlsx | Bin 34832 -> 33970 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Excel/Master BLUP Worksheet.xlsx b/Excel/Master BLUP Worksheet.xlsx index cb2624f69206ea0f20da7d238d733c526c2e3a8b..41e2174ef4b9f4200b70ca6d82688b1494e43601 100644 GIT binary patch delta 26877 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 L%XaXdVq5B`;Zcc5D+8@xkX9NbMOs>hM; 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 wlm7o22ItuUpJe*SGV1>iK2rxLb50Mt=c Date: Sun, 16 Feb 2020 15:56:56 -0800 Subject: [PATCH 20/25] Removed instructions from van der Werf example --- Excel/van der Werf.xlsx | Bin 17061 -> 15252 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Excel/van der Werf.xlsx b/Excel/van der Werf.xlsx index e7884259d4fbad99a212e383d2c813d83960595d..ad7bd78f7b483535b54f02763bedae2ab73f9040 100644 GIT binary patch delta 8166 zcmb_>cRbbY|G$w@_Q)QcBOxQQ$;c`SX%Ip(GqbmMna3VS_6VWOa_mhq!m&aeBb#)L zjAQ%0QJ=f}?tc7!pU30-J%3&2c|Bjx>-ie*_wjIL`D4ep(B8R)dxjbdABzwR3k!nP zi$jX%ij9S(@Sau?2M{^%xU?)!=&$r*Bq6<0(w%4tC5*z;ufpau=aw42Dx1`rQUC|R z5-mekcpKhA?yp7@2`|mPAGpxpE_mN6^T}4<*R94Ng7Y^;WF7%l+U$l%u6AvO97oIM zD=OX>sp%4y{dB6H1&R=&FMfC2B)Z_V^sXHRUyj#A+upk|C>h&-3wzjSXS+p6CnqdJ za%sq5urQX(a$0x zU{W|jUPa}R#_rEGAj{|d(mPTW_S%HkFGy#!K4lnfP)D<{CUZ#_y;sENYtqJ0vhF!g z77&STvK-oe6&kd5T)so-8S{+gd!eZe)!N4j2_y4~i`W^ys{M>&2l()GacV>-t|;!= zId+A!&v3y)!-)y#01ewD32N^&$0OVyk{|KqaV#YK$xBq0?w9IeD4*IlQ0G0bY!P~! zdw^kvN0u!K%{q%hMYaT3C&cF^1N$RTRmCh7-~6mhVabn;*Dk>;&6iCVmQ*d&qXwQ1 z&g4gvq@~{&PmeG=@)R4p=~N&4V;tvsc2fG?B@z2%K5noJ7mHna7ExTo?Q&^YB?z{I z7QlyDPT&9Wo(O>73emW+Mqp^~`Z&wSrT84_!$v{6Mj%W{R>xNpN;odryN@eMo03A4 zF;y zRPL)RvGX+-OnnRPLazD!nJi73(KL=U2=~x;Z2L1RZ5Vb>QsoQdm`nF4b`BMMA4gqU zZcZgId~)wL@Q!&m-Ijo>Wik0;Kl>$_2Kw^~3C6X2m_^YZL4|{fc)l;rCFD$-P#}BF z4tS8Py2ikoRs?u!~9Yfsd>>Kf>QsomBG`_b0kC^`Cz*Q{byO`AGbXH;=Mlf4~ z+H3x(ch)m#2``&7#?rN`=N?03drUwoy4&bUf93ozAV7M}<7z^G5N-A6h{c9hx9jHS zZ)C0F3rsnEEc=bmI@$=5L6l;HJ0(B6sRdAnN0{V)lHD+6APqQEoi5&3zUz<^NWXFE zIZL{$bR(p6t#7??x~DYfvjZAWbu>#x`%=dj(P05rzl9_75Z~{aYqyLZ#@=3J{8;R< zEv>f(HML=Gdpb|P>ZL5Ql_RkA9IC2pagXweWH_$Hp7OUHs%V~A@7>#j6$Uj3F4dID zr$|RKJWC6whc`@bW2ytYo|M1u?$7%aQbL$6D!PBEg zi&;n%PK$^OHX9?qf@EH38!~_H>A)B3cTcM6tK}&R<|cAR&>}tfGodj=C1g3dYI;?4 zUhW}m*6MvcuiNS9yJ-4uPHD*87BSk`WG(N#q0{ngY8rOQICNY&Kw9;1-)KXnf8OdA zVgGYTdy9F;7n?UrKtegY05Z|>2Bj-yk5CKocs8RHD(lSNPTHQ}9r^lV6Y+j`*(4v_>b+JVU(4cpN8x0zD*^Qq|G8lgwcwI3jM7$= ziBnEz?CR;QzdyC*+K*qgR2JNE`*@ehovX{dA+aH!C@pW2Yy)@^UK{L?SEwd_tSJGvaj=BlFswG!23|`ezmL=BZ0}Dyn{qJ%d zhRSl#!>`c$3h*daxd6BOIx0Q_#bJ}h5gYBCMQOGWx2|w~OX8xmn+n&I8UkJj>8Dz% zq=~O$hwC)N&td^cm=w)&dyGOaofMYDUKHwi++*1*yiE16gQGRC>R%_S&J7_;&vt_cq~+zT~kq2?DGEUD0lP7H zp(BLViqXBBbT&K%lZzYdmfSE$Y}70xs6?N<%ux_kM_^ZjGf8;HPYarVuel_cU!4Mx zdw!Z)fR->ayQEJ>u>uD>OBaft1M`=a^-)onr+!Zj8>h(7gF5z?JO_Y!8-sN9;N#IhaBUNZ~perI%W zMbrp%4c5A?jHIQ_xwv2m$HF$SI@d*_2i`}frU_O9{DC1&Jbs5>Hbo70u3r_v$5qTS zdC<1J^If)b5J}p4d04}un}@y~0B zOQb#7bNKcE7oDO-rc+tw&Xo5iXQPbmg1>w0Q!YL6m(*GAQ;(lz8O-6CX`tsIku{Q| zPv`~)?*UcM9;mZF?XXy&&85Isvz8Lq?7f$e9sc~$;Jv#s?!mr!?lj4F)tyRc*brr@ zeg0&N+9U^ZUQO(Gbk)NjY}{AMWV;Zzc}+e&rs=k9;pImUxu|X4QoYJU&dSfL=NHod>hJEqR8&^Sl(wnW%w;?;fU&F;B2p!XWDScu!mJ-&107>IBdF6&*y zw@rVGS=!OwbIwlpzCKj!k`MpUJ4Xn+k3iiO#Z%UBt``&QD}2m(x%X}<_g2hEEgy;g z1NBO(#|c`v4=go!rk*5>O_J;|<|OgAm%z^KOcC$qJSh+8Vk|sYHN7M>Q8yIR=*}}? zJ*ms_0*^eXXhcVr3vRm|d)GT6W&h-51-~Urju@sWAjVr7*i-%hpJlrOm?+1dFVM_O zuCc~0@3OJAANt<+wEqLNp$w2ccaf1csq9NOZS7@6n_^T54w{)hO{Db_p--eUljQZt z*ViK>W6@#+Gr631BI7;|YSo&TJEcuXCPTP1)>{ty9&6A??7()%Cp-n^e|X(QM%oEc zDN?nrgk|{l$|&tqX9c-R0EwSx>u`p?&YeT`t~68GGm1w&GbQU3ExqF%ShAr-Ap?s)x{x$1$PU0?~T0yUqBn7c9uDgC#ve@ zRMvvGz!bCP&TNFb*|51#v9{WmvQ(~TW2+-;9>xB_B2OycF^n17ynUw3$D9{tB-8$- z-CV8yV5<||yLq^2R;qtLyMu*AkD+=jJHz-2$5Dh$y76191Y=!}TPaAf50)bRX-AGi zMZGSncbp#Tl+u5kBQpbxDEnd#yrojxVH|47ZDj*CQ0l>=$4z_9_j1%`$%&w{N&J&u zQwf4*_An}_EO+9n^x9%h8WKVi_AXZ!*Jq9@&227$2}*6wPBqRUjTvfJY}TKM)*c2rmox{@6&-hF3v|76#ysRwjk@Q0m#70Q1ms->dAhc>F9G>Sl-MK1 zp!kIM9-3*Y7!*7{cg$s?3&H|!1s`vDtkg111%q2j;MM_Vq8q|OgRS%9$__8O+rw#y zOnUo5V0@>IaFuE&YFBU*#_GLoNJ??8M3`#aU`Z_pF8_!Mdt?Z#NkwgKiu`^eVb9=k z3bUVH0!&j?ggtdOpwm39qB-(zienAQ@`S^#WR>zEN!b(HsFq2ICJT{S$V8B7^<~ zUWXz>e!{@-Dnw8|*uT(2pnU%(-T~$NrSiK7H?;6Ck++g;KON>l3;#_7u!I)=o5dw) z;lGJ9LT&yM|113@sLgNUDCqupv#~O~thwkCYVc(QgUTyH1DByekFheF5+4{|?<;py zcSo616u1Epu26x671hyb&M?1IEABo_BPai}9ZNsk5nzIig*_*AHOhb}e z&J4!UzD);vBi#$CWp)LNaWmYv4F_8m^7#&qqHEd-drl#liX>O`#ue0{q6O#Aj*XfB z>;V9_YzZn1j>|ZQ`!MJakAhag_gmMo;<3M<_C_*bAz98VFWwRW=!n2iHC z1A4CmC^?(<6u@J`%Aixhr^%G@-Tf;Y-Sc)2j%V(7-vDU5AgJQfzZf4>d_?;%#{X); z-+Zf5h${Za_oq_AdeODK?lRTc;aJd?=ve7yv30*W9tBaxb&{?!)hL~xsR1aV)6&Z$ zc>Rv4#~Fx(X;Qwws3S+x@r&6F)BF+sw_;C{QYSzG;cG17RWmDydqC9zOWEVZsFJT zq0HGSZe_54erJUOPMODV7nI29+Xd{8b(F-<{(xXU3~|!5zk$gxhd;p@*!rKK5A3w( ze+xeu=i`Hb-%l!rb^IA04CDS2%!TFs2`0iU{{*XGOMij^Fvg!C@LQtUu%utqlK}?D zt6kgY2)XFCyR#=&87fkLv`TikKiMVY{px71FvL$X)2~_FBY7e&IS$jt7V%}|yyF~; z8H=~&Rz(%f7mp1Od(~2)tGw7U^_#&u`gB94EIMzZ^3NM`jD>AnMJJsIw)QXeNf3|Dp(#S@S-bK>-FHz79Ntp10E8>xAtSUqq3P@BNk+`gUo=Ig3V&i zKv2^pZW~x@Wt~T^MRIb3M?&JZ!N0BMD76&Cc^I0CDw?}xj;_VIKBV3iZCY{K(y01a z*U2WdE(ttXFU%Dky1m_lBrC`re+aCyM~2?-$sNfPrjjmMm(Tluk-l{u zlYswKsguN( zaz!zx+5c}z!2g}pf2p(tIyXo~8Vn{e&x(Zu;R&nhDXco;d@$I_LOTuO)_IccC-=bF z__M4dJLxZ{l_@BW3&p)8X!ocrp`4`Ua(uyTQ!t2a#2#)5MQMUII+im3Ptuspj zy2?e`cLKvRR!qA^GQN9xg-6gaaYZsoH9A#C7=Lk#!CA3decI-smsZCuvCq}`NUQHr z^peUh`sN}mb(Ui%{mTk(=;N9D^&jlpIqpo9uN*E=WG(nwF;w$>OK2{NpLg-HK@1G1 zwH~(GL57M9COl-32FnXaRx}&w1ESOAz)`hJN2$jBo%%P-R&HoA6ww+EYn+s)BeFNW zR-h)Q#Y@hyuVZ@#ZFsdLW0$Esi;Z0>y%_aLk4ll*L5PdF4^bvRM{BKMXc*@8hC1f( zb>Pveha97R(*-AcMy6KPA+!BmngG+J;%LVYyml1<-3aNs60epH7d*(M9~QH@04-xG zM{3h`HM)yOIl7OkFcmWhbNuqEhei9uwtCCxY3UHV{plygf&DQ_qbgg6JTA*ezUr6j zd8-6Hm_ifDwrq`Vyv*E9+b>*-ZoO^;NV3i!3b{9h_kCI>d%2dSvW8?O*wQ8dy zHsce=9h|SYTzz8v1LIh!Zd|IaFwyyzS1FXK!0T$B*Hww=dy*6a_9a^!+GzERY6lA< z3bq@TK;pomP!)HMNH|@>=SyezsVb!}?()t8#@-@? zg3V>Q-LbOh2HDJKHHD&;+}cQ9jNC@Gc&R@uN)lsSH5#((96w`QUGL;KPezLvN%C;4 zjTzJA6UTt*BW)z}#+;Yop#W1sZSsKr@e*7`59r&St`Z0IolaHBWhO*YQ<5V}ahT`|93~$*YoE9FxXD4~<&9 zi0)wX*C^&f%J{ zyQe1cEjUFh@5R-PBuJBu7h(LPKh+P!bM7M7SfvgZOn1^-S+i|afTN1hqIy-66=E_A z+TGG4!|sb6WK!9RSDg(bOxP`59Z(RdZj<@)`|p{f4>s5J%=$dvAH1x|l@PPc&TdWK z$WLI`Md&zwN^KuqXWVsJsjY8!5n!LHN!%Dsq&kp57ASvH^GvUD0GAEQ-;iO0V+aQ~ z1LM7{qVpWxt6PUa>=m1~#RA7|!Mtd#fFiSQ@*Q1!j}HRADcvi5OK#qAozGloXPojH zccjNFbhfsWyQkx6k<=L18m*Y*Y51sD;L6kKI$P@@!G|xyq?PQ>-2dUKABD1vjTq4( z8w@yCR~yP^>AIyG)ltNpZ>ZDZ;h@aB((`_+y4<;VbYsO3@DS3rdC=;{(J>Z_vaBRC z_o5fCD##r!8$k|hDx;Cs54y?*oRMWJ7A`hoCgle~tRO4lXkJRb|Du?cm7X+Y-I@d0L_hz=( zV8q`+%4>eRQLn!CW_*R=+Ei#JiHx(CHpX16y@35wbYq1OP+$94vPz1e)OTImc}Tx_ zIa)gUA_^{Ce{U9p_PDxRSv!OkLfpn)v}Z(FFp^t5V<%HHL9Td2bbK`dZxchG;aW-I zM^uV)Vgu^F{M7yvs{3TGS9)+r&2V`n5XM2bZa15IT8>m-_mdmBjH)kh2v`V>K#OCR zDmlVv_i`PjuPRhT8>wJVn+d$bxwuhX>}kcYPfPm*~`Q>!q{z zn;KQ$ouIj}Oqx?UAwRFQ_plzd3MFjK&iY`(G0XmF+>AR0zd5aXriC35dS)ZIXLwUL zZo1Vo&b#7G_|rpn{ATtSOEzaXoK9SS#< zmBl84=g3N6)5E7^IhaoVe@lgh)n|`|Me}7z6QN+p<@q w<)BQ*BcTo6&3ofuVNv|G39fhr;nH$aIJLrXFF6KMVk}}T955YEv18Kz08Hvd3;+NC delta 9929 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 From b8b8f755d6b89afcbfb99bc573e74b8cef97ddbe Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sun, 16 Feb 2020 15:58:57 -0800 Subject: [PATCH 21/25] Update copyright and version information --- Julia/beefblup.jl | 6 +++--- Julia/install.jl | 2 +- LICENSE.md | 2 +- MATLAB/beefblup.m | 24 ++++++++++++------------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Julia/beefblup.jl b/Julia/beefblup.jl index 16c0c6e..5cf891b 100644 --- a/Julia/beefblup.jl +++ b/Julia/beefblup.jl @@ -2,7 +2,7 @@ # Main script for performing single-variate BLUP to find beef cattle # breeding values # Usage: julia beefblup.jl -# (C) 2019 Thomas A. Christensen II +# (C) 2020 Thomas A. Christensen II # Licensed under BSD-3-Clause License # Import the required packages @@ -12,8 +12,8 @@ using Dates using Gtk # Display stuff -println("beefblup v 0.0.0.1") -println("(C) 2019 Thomas A. Christensen II") +println("beefblup v 0.1") +println("(C) 2020 Thomas A. Christensen II") println("https://github.com/millironx/beefblup") print("\n") diff --git a/Julia/install.jl b/Julia/install.jl index 1a3698d..2de4ccd 100644 --- a/Julia/install.jl +++ b/Julia/install.jl @@ -2,7 +2,7 @@ # Prepares the Julia environment for using beefblup by installing the requisite # packages # Usage: julia install.jl -# (C) 2019 Thomas A. Christensen II +# (C) 2020 Thomas A. Christensen II # Licensed under BSD-3-Clause License # Import the package manager diff --git a/LICENSE.md b/LICENSE.md index e50a0eb..08e6c89 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2018, Thomas A. Christensen II +Copyright (c) 2020, Thomas A. Christensen II All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/MATLAB/beefblup.m b/MATLAB/beefblup.m index 242fd29..d26f887 100644 --- a/MATLAB/beefblup.m +++ b/MATLAB/beefblup.m @@ -2,7 +2,7 @@ % Main script for performing single-variate BLUP to find beef cattle % breeding values % Usage: beefblup -% (C) 2018 Thomas A. Christensen II +% (C) 2020 Thomas A. Christensen II % Licensed under BSD-3-Clause License % Prepare the workspace for computation @@ -11,8 +11,8 @@ clc close all %% Display stuff -disp('beefblup v. 0.0.0.1') -disp('(C) 2018 Thomas A. Christensen II') +disp('beefblup v. 0.1') +disp('(C) 2020 Thomas A. Christensen II') disp('https://github.com/millironx/beefblup') disp(' ') @@ -77,7 +77,7 @@ for i=1:numanimals dammatch = ismember(damids, ids(i,:), 'rows'); damindexes = find(dammatch == 1); dam(damindexes) = i; - + % Find all animals that this animal sired sirematch = ismember(sireids, ids(i,:), 'rows'); sireindexes = find(sirematch == 1); @@ -91,7 +91,7 @@ colstodelete = 6; % Coerce each group to string format for i = 7:length(headers) - data(:,i) = cellfun(@num2str, data(:,i), 'UniformOutput', false); + data(:,i) = cellfun(@num2str, data(:,i), 'UniformOutput', false); end % Find any columns that need to be deleted @@ -100,7 +100,7 @@ for i = 7:length(headers) colname = headers{i}; disp(['Column "' colname '" does not have any unique animals and will be removed']) disp('from this analysis'); - colstodelete = [colstodelete i]; + colstodelete = [colstodelete i]; end end @@ -167,19 +167,19 @@ adjustedtraits = cell(1, sum(numgroups)-length(numgroups)); for i = 1:length(normal) % Find the traits that are present in this trait traits = uniquecell(data(:,i+5)); - + % Remove the "normal" version from the analysis normalindex = find(strcmp(traits, normal{i})); traits(normalindex) = []; - + % Iterate inside of the group for j = 1:length(traits) matchedindex = find(strcmp(data(:,i+5), traits{j})); X(matchedindex, I) = 1; - + % Add this trait to the string adjustedtraits(I - 1) = traits(j); - + % Increment the big counter I = I + 1; end @@ -217,7 +217,7 @@ for i = 1:numanimals A(j,i) = 0.5*A(j,sire(i)); A(i,j) = A(j,i); end - A(i,i) = 1; + A(i,i) = 1; else for j = 1:(i-1) A(j,i) = 0; @@ -313,7 +313,7 @@ for i = 1:length(numgroups) fprintf(fileID, '\t'); fprintf(fileID, num2str(reliability(I))); fprintf(fileID, '\n'); - + I = I + 1; end fprintf(fileID, '\n'); From 3c8ec0770bde1b12bba17c0a687cc291310db280 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Wed, 19 Feb 2020 17:02:52 -0800 Subject: [PATCH 22/25] Add pertinant bug report info to README --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 06763d6..ad0e397 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ this out on your own. ### How to Use -> **Note:** beefblup and [Juno](https://junolab.org)/[Julia Pro](https://juliacomputing.com/products/juliapro.html) currently don't get along. +> **Note:** beefblup and [Juno](https://junolab.org)/[Julia Pro](https://juliacomputing.com/products/juliapro.html) currently [don't get along](https://github.com/JunoLab/Juno.jl/issues/118). > Although it's tempting to just open up beefblup in Juno and press the big play > button, it won't work. Follow these instructions until it's fixed. If you > don't know what Juno is: ignore this message. @@ -144,6 +144,10 @@ julia beefblup.jl ## For Programmers +> **Also Note:** beefblup was written on, and has only been tested with Julia +> v1.2.0 and higher. While this shouldn't affect most everyday users, it might +> affect you if you are stuck on the current LTS version of Julia (v1.0.5). + ### Development Roadmap | Version | Feature | From 691710b005d9ecf584811a716c6103fd563f1dd2 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sun, 11 Oct 2020 20:48:19 -0600 Subject: [PATCH 23/25] Simplify README --- README.md | 153 +++++++++--------------------------------------------- 1 file changed, 25 insertions(+), 128 deletions(-) diff --git a/README.md b/README.md index ad0e397..1840485 100644 --- a/README.md +++ b/README.md @@ -1,146 +1,47 @@ # [:cow:]: beefblup +[![GitHub license](https://img.shields.io/github/license/MillironX/beefblup)](https://github.com/MillironX/beefblup/blob/master/LICENSE.md) +[![Join the chat at https://gitter.im/beefblup/community](https://badges.gitter.im/beefblup/community.svg)](https://gitter.im/beefblup/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Github all releases](https://img.shields.io/github/downloads/MillironX/beefblup/total.svg)](https://GitHub.com/MillironX/beefblup/releases) + beefblup is a program for ranchers to calculate expected breeding values (EBVs) for their own beef cattle. It is intended to be usable by anyone without requiring any prior knowledge of computer programming or linear algebra. Why? It's part of my effort to **\#KeepEPDsReal** -[:arrow_down_small: Download beefblup](https://github.com/MillironX/beefblup/archive/master.zip) +## Installation -> **Notice:** beefblup for MATLAB and beefblup for Python are going away. I'm -> going to make changes here soon that will break the MATLAB version of -> beefblup, and I don't intend to update it anymore. (How many ranchers do you -> know that can afford MATLAB?) As for beefblup for Python, it never really got -> off the ground, and beefblup for Julia has superceded it. +1. [Download and install Julia](https://julialang.org/downloads/platform/) +2. Open a new Julia window and type the `]` key +3. Type `add XLSX Gtk` and press **Enter** -## For Users +Alternatively, you can run the [install +script](https://github.com/MillironX/beefblup/raw/master/Julia/install.jl) from +Julia. -### Installation - -#### Windows (My Platform) - -1. Press the **Windows Key** + **X**, and then press **A**, and select **Yes** -2. [Install Chocolatey](https://chocolatey.org/install) using the PowerShell - window that opened -3. Close PowerShell -4. Press the **Windows Key** + **X**, and then press **A**, and select **Yes** - (Again) -5. Type `choco install Julia -y` into PowerShell and press **Enter** -6. Close PowerShell once Chocolatey has finished -7. [Download beefblup](https://github.com/MillironX/beefblup/archive/master.zip) - and unzip it to somewhere you will remember it -8. Hold down the **Shift** key, and **right-click** in a blank space in the - "Julia" folder of beefblup -9. Click **Open PowerShell window here" -10. Type `julia install.jl` into PowerShell and press **Enter** -11. Close PowerShell once Julia has finished - -Why do you need Chocolatey? Because it allows you to access Julia (and therefore -beefblup) from the **Shift**+**Right-click** menu directly, without having to -worry about `cd` commands or editing your `%PATH%`. That's good, right? - -#### Mac - -1. [Download and install Julia](https://julialang.org/downloads/) -2. Open terminal.app, and run the following - -```bash -curl https://github.com/MillironX/beefblup/archive/master.zip -o beefblup.zip -unzip beefblup.zip -rm beefblup.zip -``` - -3. Quit terminal.app -4. Open julia.app, and run the following - -```julia -cd("~/beefblup/beefblup-master/Julia") -include("install.jl") -``` - -5. Quit julia.app - -I don't know if these are right, since I can't afford a Mac. If any of you -super-privileged Apple snobs out there use beefblup, please add proper -instructions here and submit a pull request. - -#### Debian/Ubuntu Linux - -TODO: Add instructions here. This is slightly complicated since there is no -Julia package in the main repositories, and I don't use Debian distros enough to -know where to find a third-party repos - -#### Fedora Linux (The best platform) - -From a new terminal, run - -```bash -sudo dnf install julia -y -wget https://github.com/MillironX/beefblup/archive/master.zip -O beefblup.zip -unzip beefblup.zip -rm beefblup.zip -cd beefblup/beefblup-master/Julia -julia install.jl -exit -``` - -#### Other Platforms - -Seriously? If you're enough of a geek to be using something else, you can figure -this out on your own. - -### How to Use +## How to Use > **Note:** beefblup and [Juno](https://junolab.org)/[Julia Pro](https://juliacomputing.com/products/juliapro.html) currently [don't get along](https://github.com/JunoLab/Juno.jl/issues/118). > Although it's tempting to just open up beefblup in Juno and press the big play > button, it won't work. Follow these instructions until it's fixed. If you > don't know what Juno is: ignore this message. -#### All platforms - -1. Download the [Excel template](https://github.com/MillironX/beefblup/raw/master/Excel/Master%20BLUP%20Worksheet.xlsx) -2. Replace the sample data in the spreadsheet with your own +1. Download the [beefblup ZIP + file](https://github.com/MillironX/beefblup/archive/0.1.zip) and unzip it + someplace memorable +2. Make a copy of the "Master BLUP Worksheet" and replace the sample data with your own 3. If you wish to add more contemporary group traits to your analysis, replace or add them to the right of the Purple section -4. Save, and continue with your platform-specific instructions below - -#### Windows - -5. Remember where you downloaded beefblup to when you installed it -6. Hold down the **Shift** key, and **right-click** in a blank space in the - "Julia" folder of beefblup -7. Click **Open PowerShell window here" -8. Type `julia beefblup.jl` into PowerShell and press **Enter** -9. Select the spreadsheet you created in Step 4 +4. Save and close +5. In your file explorer, copy the address of the "Julia" folder +6. Launch Julia +7. Type `cd(" Date: Sun, 11 Oct 2020 20:51:43 -0600 Subject: [PATCH 24/25] Add code of conduct Because it's the hip thing to do these days --- CODE_OF_CONDUCT.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ad578ed --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,14 @@ +# [:cow:]: The Code of the West + +## Ten principles to live by + +1. Live each day with courage. +2. Take pride in your work. +3. Always finish what you start. +4. Do what has to be done. +5. Be tough, but fair. +6. When you make a promise, keep it. +7. Ride for the brand. +8. Talk less and say more. +9. Remember that some things aren't for sale. +10. Know where to draw the line. From f7fdd37144e4bce4a5d0d2b8d24f684662b1bd90 Mon Sep 17 00:00:00 2001 From: "Thomas A. Christensen II" <25492070+MillironX@users.noreply.github.com> Date: Sun, 11 Oct 2020 20:53:34 -0600 Subject: [PATCH 25/25] Fix download link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1840485..6faef51 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Julia. > don't know what Juno is: ignore this message. 1. Download the [beefblup ZIP - file](https://github.com/MillironX/beefblup/archive/0.1.zip) and unzip it + file](https://github.com/MillironX/beefblup/archive/v0.1.zip) and unzip it someplace memorable 2. Make a copy of the "Master BLUP Worksheet" and replace the sample data with your own 3. If you wish to add more contemporary group traits to your analysis, replace