From 47498b4c0ba9a2857098750d61cca650acee75e1 Mon Sep 17 00:00:00 2001 From: Simon Steiger <106233551+simonsteiger@users.noreply.github.com> Date: Mon, 29 Jul 2024 13:33:52 +0200 Subject: [PATCH] add categorise (#7) * add categorise - categorise method for continuouscomposites and faceted modifications - added tests * add docstring to categorise --- src/RheumaComposites.jl | 3 ++- src/utils/categorise.jl | 54 +++++++++++++++++++++++++++++++++++++++++ test/types/das28.jl | 14 +++++++++++ test/types/sdai.jl | 7 ++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/utils/categorise.jl diff --git a/src/RheumaComposites.jl b/src/RheumaComposites.jl index 8419ce7..5227a18 100644 --- a/src/RheumaComposites.jl +++ b/src/RheumaComposites.jl @@ -23,6 +23,7 @@ export weight export score export isremission export decompose +export categorise include("utils/units.jl") include("utils/valid.jl") @@ -36,6 +37,6 @@ include("utils/weight.jl") include("utils/score.jl") include("utils/remission.jl") include("utils/decompose.jl") -# include("utils/categorise.jl") +include("utils/categorise.jl") end diff --git a/src/utils/categorise.jl b/src/utils/categorise.jl new file mode 100644 index 0000000..29419c8 --- /dev/null +++ b/src/utils/categorise.jl @@ -0,0 +1,54 @@ +function categorise(::Type{DAS28CRP}, v) + out = v < 2.4 ? "Remission" : + v <= 2.9 ? "Low" : + v <= 4.6 ? "Moderate" : + "High" + return out +end + +function categorise(::Type{DAS28ESR}, v) + out = v < 2.6 ? "Remission" : + v <= 3.2 ? "Low" : + v <= 5.1 ? "Moderate" : + "High" + return out +end + +function categorise(::Type{SDAI}, v) + out = v < 3.3 ? "Remission" : + v <= 11.0 ? "Low" : + v <= 26.0 ? "Moderate" : + "High" + return out +end + +""" + categorise(x::ContinuousComposite) + +Convert `x` to a discrete value. + +# Examples + +```jldoctest +julia> DAS28ESR(t28=4, s28=5, pga=12u"mm", apr=44u"mm/hr") |> categorise +"Moderate" +``` + + categorise(::Type{SDAI}, v) + +Convert `v` to a discrete value using `SDAI` thresholds. + +The same functionality exists for other `ContinuousComposites`. + +See also [`DAS28ESR`](@ref), [`DAS28CRP`](@ref). + +# Examples + +```jldoctest +julia> categorise(SDAI, 3.6) +"Low" +``` +""" +categorise(x::ContinuousComposite) = categorise(typeof(x), score(x)) + +categorise(x::Faceted{<:ContinuousComposite}) = categorise(typeof(x.c0), score(x.c0)) diff --git a/test/types/das28.jl b/test/types/das28.jl index bd37b9d..548a796 100644 --- a/test/types/das28.jl +++ b/test/types/das28.jl @@ -51,6 +51,13 @@ end @test sum(decompose(faceted(das28e, facets), digits=5)) ≈ 1.0 atol = 1e-5 end +@testset "Categorise DAS28ESR" begin + @test categorise(das28e) == "Moderate" + @test categorise.(DAS28ESR, [2.59, 2.61]) == ["Remission", "Low"] + @test categorise.(DAS28ESR, [3.19, 3.21]) == ["Low", "Moderate"] + @test categorise.(DAS28ESR, [5.09, 5.11]) == ["Moderate", "High"] +end + @testset "Construct DAS28CRP" begin @test das28c isa AbstractComposite @test das28c isa ContinuousComposite @@ -82,3 +89,10 @@ end @test score(faceted(das28c, facets)) == score(das28c) @test sum(decompose(faceted(das28c, facets), digits=5)) ≈ 1.0 atol = 1e-5 end + +@testset "Categorise DAS28CRP" begin + @test categorise(das28c) == "Moderate" + @test categorise.(DAS28CRP, [2.39, 2.51]) == ["Remission", "Low"] + @test categorise.(DAS28CRP, [2.89, 2.91]) == ["Low", "Moderate"] + @test categorise.(DAS28CRP, [4.59, 4.61]) == ["Moderate", "High"] +end diff --git a/test/types/sdai.jl b/test/types/sdai.jl index 5d2b539..1e31359 100644 --- a/test/types/sdai.jl +++ b/test/types/sdai.jl @@ -33,3 +33,10 @@ end @test isremission(sdai) @test !isremission(SDAI(t28=3, s28=4, pga=4u"cm", ega=4u"cm", crp=5u"mg/dL")) end + +@testset "Categorise SDAI" begin + @test categorise(sdai) == "Remission" + @test categorise.(SDAI, [3.29, 3.31]) == ["Remission", "Low"] + @test categorise.(SDAI, [10.99, 11.01]) == ["Low", "Moderate"] + @test categorise.(SDAI, [25.99, 26.01]) == ["Moderate", "High"] +end