From 76b7f44f8425cf81a3779c2e1fe625829090bec8 Mon Sep 17 00:00:00 2001 From: giadasp Date: Sun, 20 Dec 2020 16:54:29 +0100 Subject: [PATCH] fix format --- src/bayesian.jl | 156 ++++++++++++--------------- src/calibration/PolyaGamma_MCMC.jl | 2 +- src/examinee/latent/1D.jl | 6 +- src/examinee/latent/ND.jl | 16 +-- src/item/parameters/binary/1pl.jl | 4 +- src/item/parameters/binary/2pl.jl | 10 +- src/item/parameters/binary/3pl.jl | 4 +- src/item/parameters/binary/binary.jl | 2 +- src/likelihood.jl | 6 +- src/online/design/A.jl | 2 +- src/online/design/A_gain.jl | 10 +- src/online/design/A_inv_gain.jl | 7 +- src/online/design/D.jl | 4 +- src/online/design/D_gain.jl | 7 +- src/online/design/D_inv_gain.jl | 2 +- src/response.jl | 36 +++++-- 16 files changed, 137 insertions(+), 137 deletions(-) diff --git a/src/bayesian.jl b/src/bayesian.jl index 2dfb86c8..9a36d896 100644 --- a/src/bayesian.jl +++ b/src/bayesian.jl @@ -5,19 +5,32 @@ struct PolyaGammaSample PolyaGammaSample(i_idx, e_idx, val) = new(i_idx, e_idx, val) end +""" + posterior( + item::AbstractItem, + examinees::Vector{<:AbstractExaminee}, #must be sorted by e.idx + responses::Vector{<:AbstractResponse}, #only responses of item sorted by e.idx + W::Vector{PolyaGammaSample}, #sorted by e.idx + ) + +""" function posterior( item::AbstractItem, examinees::Vector{<:AbstractExaminee}, #must be sorted by e.idx - responses::Vector{ResponseBinary}, #only responses of item sorted by e.idx + responses::Vector{<:AbstractResponse}, #only responses of item sorted by e.idx W::Vector{PolyaGammaSample}, #sorted by e.idx ) - return posterior(item.parameters, - map(e -> e.latent, examinees), - responses, - W, - ) + return posterior(item.parameters, map(e -> e.latent, examinees), responses, W) end +""" + update_posterior!( + item::AbstractItem, + examinees::Vector{<:AbstractExaminee}, #must be sorted by e.idx + responses::Vector{<:AbstractResponse}, #only responses of item sorted by e.idx + W::Vector{PolyaGammaSample}, #sorted by e.idx + ) +""" function update_posterior!( item::AbstractItem, examinees::Vector{<:AbstractExaminee}, #must be sorted by e.idx @@ -27,17 +40,21 @@ function update_posterior!( item.parameters.posterior = posterior(item, examinees, responses, W) end +""" + posterior( + examinee::AbstractExaminee, + items::Vector{<:AbstractItem}, #only items answered by examinee sorted by i.idx + responses::Vector{<:AbstractResponse}, #only responses of examinee sorted by i.idx + W::Vector{PolyaGammaSample}, + ) +""" function posterior( examinee::AbstractExaminee, items::Vector{<:AbstractItem}, #only items answered by examinee sorted by i.idx responses::Vector{<:AbstractResponse}, #only responses of examinee sorted by i.idx W::Vector{PolyaGammaSample}, ) - return posterior(examinee.latent, - map(i -> i.parameters, items), - responses, - W, - ) + return posterior(examinee.latent, map(i -> i.parameters, items), responses, W) end function posterior( @@ -52,10 +69,9 @@ function posterior( mu = sigma2 * ( mapreduce( - (i, w, r) -> - i.a * (i.a * i.b * w.val + - #(get_responses_by_item_id(i.id, responses_e)[1].val - 0.5) - (r.val - 0.5)), + (i, w, r) -> i.a * (i.a * i.b * w.val + + #(get_responses_by_item_id(i.id, responses_e)[1].val - 0.5) + (r.val - 0.5)), +, parameters, W, @@ -65,6 +81,14 @@ function posterior( return Distributions.Normal(mu, sqrt(sigma2))::Distributions.ContinuousDistribution end +""" + update_posterior!( + examinee::AbstractExaminee, + items::Vector{<:AbstractItem}, #only items answered by examinee sorted by i.idx + responses::Vector{<:AbstractResponse}, #only responses of examinee sorted by i.idx + W::Vector{PolyaGammaSample}, + ) +""" function update_posterior!( examinee::AbstractExaminee, items::Vector{<:AbstractItem}, #only items answered by examinee sorted by i.idx @@ -77,15 +101,14 @@ end function posterior( latent::Latent1D, parameters::Parameters2PL, + response::ResponseBinary, w::PolyaGammaSample, - r::ResponseBinary - ) +) sigma2 = (parameters.a^2) * w.val sigma2 = 1 / (sigma2 + (1 / Distributions.var(latent.prior))) mu = sigma2 * ( - parameters.a * - (parameters.a * parameters.b * w.val + (r.val - 0.5)) + + parameters.a * (parameters.a * parameters.b * w.val + (response.val - 0.5)) + (latent.prior.μ / Distributions.var(latent.prior)) ) return Distributions.Normal(mu, sqrt(sigma2)) @@ -96,34 +119,29 @@ end posterior( examinee::AbstractExaminee, item::AbstractItem, + response::ResponseBinary, w::PolyaGammaSample, - r::ResponseBinary ) """ function posterior( examinee::AbstractExaminee, item::AbstractItem, + response::ResponseBinary, w::PolyaGammaSample, - r::ResponseBinary - ) - return posterior( - examinee.latent, - item.parameters, - w, - r - ) +) + return posterior(examinee.latent, item.parameters, response, w) end function posterior( - parameters::Parameters2PL, - latent::Latent1D, + parameters::Parameters2PL, + latent::Latent1D, + response::ResponseBinary, w::PolyaGammaSample, - r::ResponseBinary - ) +) a = parameters.a b = parameters.b latent_val = latent.val - r_val = r.val + r_val = response.val w_val = w.val sigma2 = [(latent_val - b)^2 * w.val, a^2 * w_val] @@ -143,16 +161,12 @@ function posterior( end function posterior( - item::AbstractItem, - examinee::AbstractExaminee, + item::AbstractItem, + examinee::AbstractExaminee, + response::AbstractResponse, w::PolyaGammaSample, - r::ResponseBinary - ) - return posterior(item.parameters, - examinee.latent, - w, - r, - ) +) + return posterior(item.parameters, examinee.latent, response, w) end @@ -169,13 +183,10 @@ function posterior( sigma2 = mapreduce((e, w) -> [(e.val - b)^2, a^2] .* w.val, +, latents, W) sigma2 = 1 ./ (sigma2 + (1 ./ Distributions.var.(prior))) mu = mapreduce( - (e, w, r) -> [ - (e.val - b) * (r.val - 0.5), - -a * ( - #(get_responses_by_examinee_id(e.id, responses)[1].val - 0.5) - - (r.val - 0.5) - (a * e.val * w.val) - ), - ], + (e, w, r) -> [(e.val - b) * (r.val - 0.5), -a * ( + #(get_responses_by_examinee_id(e.id, responses)[1].val - 0.5) - + (r.val - 0.5) - (a * e.val * w.val) + )], +, latents, W, @@ -189,29 +200,6 @@ function posterior( end -""" - posterior( - item::AbstractItem, - examinees::Vector{<:AbstractExaminee}, #must be sorted by e.idx - responses::Vector{ResponseBinary}, #only responses of item sorted by e.idx - W::Vector{PolyaGammaSample}, #sorted by e.idx - ) - -""" -function posterior( - item::AbstractItem, - examinees::Vector{<:AbstractExaminee}, #must be sorted by e.idx - responses::Vector{ResponseBinary}, #only responses of item sorted by e.idx - W::Vector{PolyaGammaSample}, #sorted by e.idx -) - return posterior(item.parameters, - map(e -> e.latent, examinees), - responses, - W, - ) -end - - function generate_w(examinee::AbstractExaminee, items::Vector{<:AbstractItem}) return map( i -> PolyaGammaSample( @@ -227,31 +215,23 @@ function generate_w(examinee::AbstractExaminee, items::Vector{<:AbstractItem}) end function generate_w(parameters::Parameters2PL, latent::Latent1D) - return Distributions.rand(PolyaGamma( - 1, - parameters.a * (latent.val - parameters.b), - )) + return Distributions.rand(PolyaGamma(1, parameters.a * (latent.val - parameters.b))) end function generate_w(item::AbstractItem, examinees::Vector{<:AbstractExaminee}) return map( - e -> PolyaGammaSample( - item.idx, - e.idx, - generate_w(item.parameters, e.latent) - ), + e -> PolyaGammaSample(item.idx, e.idx, generate_w(item.parameters, e.latent)), examinees, ) end -function generate_w(items::Vector{<:AbstractItem}, examinees_i::Vector{Vector{<:AbstractExaminee}}) +function generate_w( + items::Vector{<:AbstractItem}, + examinees_i::Vector{Vector{<:AbstractExaminee}}, +) return mapreduce( i -> map( - e -> PolyaGammaSample( - i.idx, - e.idx, - generate_w(i.parameters, e.latent) - ), + e -> PolyaGammaSample(i.idx, e.idx, generate_w(i.parameters, e.latent)), examinees_i[i.idx], ), vcat, @@ -316,7 +296,7 @@ function mcmc_iter!( end function mcmc_iter!( - examinee:: AbstractExaminee, + examinee::AbstractExaminee, items::Vector{<:AbstractItem}, responses::Vector{<:AbstractResponse}, W::Vector{PolyaGammaSample}; diff --git a/src/calibration/PolyaGamma_MCMC.jl b/src/calibration/PolyaGamma_MCMC.jl index 22d07475..c6fc0b5b 100644 --- a/src/calibration/PolyaGamma_MCMC.jl +++ b/src/calibration/PolyaGamma_MCMC.jl @@ -43,4 +43,4 @@ function estimate_ability!( mcmc_iter!(examinee, items, responses, W; sampling = sampling) end update_estimate!(examinee; sampling = sampling) -end \ No newline at end of file +end diff --git a/src/examinee/latent/1D.jl b/src/examinee/latent/1D.jl index 70eec288..c07f796a 100644 --- a/src/examinee/latent/1D.jl +++ b/src/examinee/latent/1D.jl @@ -82,8 +82,10 @@ end function update_estimate!(latent::Latent1D; sampling = true) chain_size = size(latent.chain, 1) if sampling - latent.val = sum(latent.chain[(chain_size - min(999, chain_size - 1)) : end]) / min(1000, chain_size) + latent.val = + sum(latent.chain[(chain_size-min(999, chain_size - 1)):end]) / + min(1000, chain_size) else latent.val = sum(latent.chain) / chain_size end -end \ No newline at end of file +end diff --git a/src/examinee/latent/ND.jl b/src/examinee/latent/ND.jl index 3e180634..4d932703 100644 --- a/src/examinee/latent/ND.jl +++ b/src/examinee/latent/ND.jl @@ -27,13 +27,13 @@ LatentND(dist, bounds) Randomly generates a value for the N-dimensional latent variable and assigns a custom multivariate distribution to prior and posterior with specific bounds. """ mutable struct LatentND <: AbstractLatent -names::Vector{String} -val::Vector{Float64} -bounds::Vector{Vector{Float64}} -prior::Distributions.MultivariateDistribution -posterior::Distributions.MultivariateDistribution -chain::Vector{Vector{Float64}} -expected_information::Matrix{Float64} + names::Vector{String} + val::Vector{Float64} + bounds::Vector{Vector{Float64}} + prior::Distributions.MultivariateDistribution + posterior::Distributions.MultivariateDistribution + chain::Vector{Vector{Float64}} + expected_information::Matrix{Float64} function LatentND(names, val, bounds, prior, posterior, chain, expected_information) new(names, val, bounds, prior, posterior, chain, expected_information) @@ -49,4 +49,4 @@ expected_information::Matrix{Float64} val = truncate_rand(dist, bounds) new(string.("L_", collect(1:N)), val, bounds, dist, dist, [val], LinearAlgebra.I(N)) end -end \ No newline at end of file +end diff --git a/src/item/parameters/binary/1pl.jl b/src/item/parameters/binary/1pl.jl index 0e653372..cca827ae 100644 --- a/src/item/parameters/binary/1pl.jl +++ b/src/item/parameters/binary/1pl.jl @@ -32,5 +32,5 @@ end """ function empty_chain!(parameters::Parameters1PL) - parameters.chain = Vector{Float64}(undef,0) -end \ No newline at end of file + parameters.chain = Vector{Float64}(undef, 0) +end diff --git a/src/item/parameters/binary/2pl.jl b/src/item/parameters/binary/2pl.jl index 22b85fca..e270645c 100644 --- a/src/item/parameters/binary/2pl.jl +++ b/src/item/parameters/binary/2pl.jl @@ -75,7 +75,7 @@ end """ function empty_chain!(parameters::Parameters2PL) - parameters.chain = Vector{Vector{Float64}}(undef,0) + parameters.chain = Vector{Vector{Float64}}(undef, 0) end """ @@ -99,13 +99,13 @@ end """ function update_estimate!(parameters::Parameters2PL; sampling = true) chain_size = size(parameters.chain, 1) - if sampling - chain_matrix = hcat(parameters.chain[(chain_size - min(999, chain_size - 1)) : end]...) + if sampling + chain_matrix = hcat(parameters.chain[(chain_size-min(999, chain_size - 1)):end]...) vals = [sum(i) / min(1000, chain_size) for i in eachrow(chain_matrix)] else chain_matrix = hcat(parameters.chain...) - vals = [sum(i) / chain_size for i in eachrow(chain_matrix)] + vals = [sum(i) / chain_size for i in eachrow(chain_matrix)] end parameters.a = vals[1] parameters.b = vals[2] -end \ No newline at end of file +end diff --git a/src/item/parameters/binary/3pl.jl b/src/item/parameters/binary/3pl.jl index d0f50e35..b0109f34 100644 --- a/src/item/parameters/binary/3pl.jl +++ b/src/item/parameters/binary/3pl.jl @@ -86,5 +86,5 @@ end """ function empty_chain!(parameters::Parameters3PL) - parameters.chain = Vector{Vector{Float64}}(undef,0) -end \ No newline at end of file + parameters.chain = Vector{Vector{Float64}}(undef, 0) +end diff --git a/src/item/parameters/binary/binary.jl b/src/item/parameters/binary/binary.jl index 3ce34763..b8bce37c 100644 --- a/src/item/parameters/binary/binary.jl +++ b/src/item/parameters/binary/binary.jl @@ -3,4 +3,4 @@ abstract type AbstractParametersBinary <: AbstractParameters end include("1pl.jl") include("2pl.jl") include("3pl.jl") -include("Npl.jl") \ No newline at end of file +include("Npl.jl") diff --git a/src/likelihood.jl b/src/likelihood.jl index b6a26c8b..e398eced 100644 --- a/src/likelihood.jl +++ b/src/likelihood.jl @@ -147,7 +147,11 @@ end It computes the likelihood for a 1-dimensional latent variable and item parameters `parameters` with answer `response_val`. """ -function likelihood(response_val::Float64, latent::Latent1D, parameters::AbstractParametersBinary) +function likelihood( + response_val::Float64, + latent::Latent1D, + parameters::AbstractParametersBinary, +) return likelihood(response_val, latent.val, parameters) end diff --git a/src/online/design/A.jl b/src/online/design/A.jl index 1be8f834..9ce77458 100644 --- a/src/online/design/A.jl +++ b/src/online/design/A.jl @@ -27,4 +27,4 @@ It returns a `Float64` scalar. """ function A_method(item::AbstractItem, examinee::AbstractExaminee) return A_method(item.parameters, examinee.latent) -end \ No newline at end of file +end diff --git a/src/online/design/A_gain.jl b/src/online/design/A_gain.jl index 88930bfc..f1a574b0 100644 --- a/src/online/design/A_gain.jl +++ b/src/online/design/A_gain.jl @@ -2,17 +2,16 @@ A_gain_method(parameters::Parameters1PL, latent::Latent1D) """ function A_gain_method(parameters::Parameters1PL, latent::Latent1D) -return expected_information_item(parameters, latent) + return expected_information_item(parameters, latent) end """ A_gain_method(parameters::Parameters2PL, latent::Latent1D) """ function A_gain_method(parameters::Parameters2PL, latent::Latent1D) -old_exp_info = copy(parameters.expected_information) -return LinearAlgebra.tr( - old_exp_info + expected_information_item(parameters, latent), -) - LinearAlgebra.tr(old_exp_info) + old_exp_info = copy(parameters.expected_information) + return LinearAlgebra.tr(old_exp_info + expected_information_item(parameters, latent)) - + LinearAlgebra.tr(old_exp_info) end """ @@ -31,4 +30,3 @@ It returns a `Float64` scalar. function A_gain_method(item::AbstractItem, examinee::AbstractExaminee) return A_gain_method(item.parameters, examinee.latent) end - diff --git a/src/online/design/A_inv_gain.jl b/src/online/design/A_inv_gain.jl index 13cf8c36..1fd1996e 100644 --- a/src/online/design/A_inv_gain.jl +++ b/src/online/design/A_inv_gain.jl @@ -11,9 +11,8 @@ end function A_inv_gain_method(parameters::Parameters2PL, latent::Latent1D) old_exp_info = copy(parameters.expected_information) return LinearAlgebra.tr( - LinearAlgebra.inv( - old_exp_info + expected_information_item(parameters, latent), - ) - LinearAlgebra.inv(old_exp_info), + LinearAlgebra.inv(old_exp_info + expected_information_item(parameters, latent)) - + LinearAlgebra.inv(old_exp_info), ) end @@ -32,4 +31,4 @@ It returns a `Float64` scalar. """ function A_inv_gain_method(item::AbstractItem, examinee::AbstractExaminee) return A_inv_gain_method(item.parameters, examinee.latent) -end \ No newline at end of file +end diff --git a/src/online/design/D.jl b/src/online/design/D.jl index 9b240bd2..b0086b32 100644 --- a/src/online/design/D.jl +++ b/src/online/design/D.jl @@ -3,14 +3,14 @@ D_method(parameters::Parameters1PL, latent::Latent1D) """ function D_method(parameters::Parameters1PL, latent::Latent1D) -return expected_information_item(parameters, latent) + return expected_information_item(parameters, latent) end """ D_method(parameters::Parameters2PL, latent::Latent1D) """ function D_method(parameters::Parameters2PL, latent::Latent1D) -return LinearAlgebra.det(expected_information_item(parameters, latent)) + return LinearAlgebra.det(expected_information_item(parameters, latent)) end """ diff --git a/src/online/design/D_gain.jl b/src/online/design/D_gain.jl index 7743ebd8..8883c373 100644 --- a/src/online/design/D_gain.jl +++ b/src/online/design/D_gain.jl @@ -10,9 +10,8 @@ end """ function D_gain_method(parameters::Parameters2PL, latent::Latent1D) old_exp_info = copy(parameters.expected_information) - return LinearAlgebra.det( - old_exp_info + expected_information_item(parameters, latent), - ) - LinearAlgebra.det(old_exp_info) + return LinearAlgebra.det(old_exp_info + expected_information_item(parameters, latent)) - + LinearAlgebra.det(old_exp_info) end """ @@ -33,4 +32,4 @@ end """ function D_gain_method(item::AbstractItem, examinee::AbstractExaminee) return D_gain_method(item.parameters, examinee.latent) -end \ No newline at end of file +end diff --git a/src/online/design/D_inv_gain.jl b/src/online/design/D_inv_gain.jl index 6c267364..1d09c07f 100644 --- a/src/online/design/D_inv_gain.jl +++ b/src/online/design/D_inv_gain.jl @@ -34,4 +34,4 @@ __Yinhong He & Ping Chen, 2020. "Optimal Online Calibration Designs for Item Rep """ function D_inv_gain_method(item::AbstractItem, examinee::AbstractExaminee) return D_inv_gain_method(item.parameters, examinee.latent) -end \ No newline at end of file +end diff --git a/src/response.jl b/src/response.jl index d62386b2..f9f774d2 100644 --- a/src/response.jl +++ b/src/response.jl @@ -5,13 +5,26 @@ struct ResponseBinary <: AbstractResponse examinee_idx::Int64 item_id::String examinee_id::String - val::Union{Missing, Float64} + val::Union{Missing,Float64} start_time::Dates.DateTime end_time::Dates.DateTime - ResponseBinary(item_idx, examinee_idx, item_id, examinee_id, val, start_time, end_time) = - new(item_idx, examinee_idx, item_id, examinee_id, val, start_time, end_time) - ResponseBinary(item_idx, examinee_idx, item_id, examinee_id, val, time::Dates.DateTime) = - new(item_idx, examinee_idx, item_id, examinee_id, val, time, time) + ResponseBinary( + item_idx, + examinee_idx, + item_id, + examinee_id, + val, + start_time, + end_time, + ) = new(item_idx, examinee_idx, item_id, examinee_id, val, start_time, end_time) + ResponseBinary( + item_idx, + examinee_idx, + item_id, + examinee_id, + val, + time::Dates.DateTime, + ) = new(item_idx, examinee_idx, item_id, examinee_id, val, time, time) end # Outer Constructor Methods @@ -56,7 +69,10 @@ end It returns the vector of responses given by examinee with id = `id`. """ -function get_responses_by_examinee_id(examinee_id::String, responses::Vector{<:AbstractResponse}) +function get_responses_by_examinee_id( + examinee_id::String, + responses::Vector{<:AbstractResponse}, +) filter(r -> r.examinee_id == examinee_id, responses) end @@ -78,7 +94,7 @@ The vector of responses is sorted by `examinee_idx` if `sorted = true`. function get_responses_by_item_idx( item_idx::Int64, responses::Vector{<:AbstractResponse}; - sorted = true + sorted = true, ) resp_item = filter(r -> r.item_idx == item_idx, responses) if sorted @@ -148,7 +164,10 @@ function answer_binary( examinees::Vector{<:AbstractExaminee}, items::Vector{<:AbstractItem}, ) - answer_binary(get_examinee_by_id(examinee_id, examinees), get_item_by_id(item_id, items)) + answer_binary( + get_examinee_by_id(examinee_id, examinees), + get_item_by_id(item_id, items), + ) end """ @@ -229,4 +248,3 @@ function get_examinees_idx_who_answered_item( resp_e = get_responses_by_item_id(item.id, responses) return map(r -> r.examinee_idx, resp_e) end -