Skip to content

Commit 5a192dc

Browse files
committed
Tolerate more types in one-hot coding
1 parent 7dbd4f7 commit 5a192dc

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

src/mca.jl

+9-7
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ function fit(
463463
end
464464

465465
# Get the indicator matrix
466-
XI, rd, dr = make_indicators(X)
466+
XI, rd, dr = make_indicators(X, "active")
467467

468468
# Create the underlying correspondence analysis value
469469
C = fit(CA, XI; d = d, normalize = normalize, method = method)
@@ -490,7 +490,7 @@ function quali_passive(mca::MCA, passive; normalize = "principal")
490490
error("Wrong number of rows in passive data array")
491491
end
492492

493-
PI, _, drp = make_indicators(passive)
493+
PI, _, drp = make_indicators(passive, "passive")
494494
r = quali_passive(C, PI; normalize = normalize)
495495

496496
vnames = if typeof(passive) <: AbstractDataFrame
@@ -508,19 +508,21 @@ end
508508
# values in the vector 'z'. Also returns dictionaries mapping
509509
# the unique values to column offsets, and mapping the column
510510
# offsets to the unique values.
511-
function make_single_indicator(z::Vector{T}) where {T}
511+
function make_single_indicator(z::AbstractVector, vtype::String, pos::Int)
512512

513513
n = length(z)
514514

515515
# Unique values of the variable
516516
uq = sort(unique(z))
517517

518-
if length(uq) > 50
519-
@warn("Nominal variable has more than 50 levels")
518+
# This situation usually results from user error so warn.
519+
if length(uq) > 20
520+
@warn("$(titlecase(vtype)) variable in column $(pos) has more than 20 levels")
520521
end
521522

522523
# Recoding dictionary, maps each distinct value in z to
523524
# an offset
525+
T = eltype(z)
524526
rd = Dict{T,Int}()
525527
rdi = []
526528
for (j, v) in enumerate(uq)
@@ -551,7 +553,7 @@ end
551553
# In addition to the indicator matrix, return vectors of
552554
# dictionaries mapping levels to positions and positions
553555
# to levels for each variable.
554-
function make_indicators(Z)
556+
function make_indicators(Z, vtype::String)
555557

556558
if size(Z, 1) == 0
557559
return zeros(0, 0), Dict[], Vector[]
@@ -560,7 +562,7 @@ function make_indicators(Z)
560562
rd, rdi = Dict[], Vector[]
561563
XX = []
562564
for j = 1:size(Z, 2)
563-
X, dv, di = make_single_indicator(Z[:, j])
565+
X, dv, di = make_single_indicator(Z[:, j], vtype, j)
564566
push!(rd, dv)
565567
push!(rdi, di)
566568
push!(XX, X)

0 commit comments

Comments
 (0)