fix: propagate error from Quartile for inputs too small for quartiles
Quartile computed the median of empty slices for inputs with fewer than three elements and discarded the resulting error, returning NaN quartiles with a nil error. The silent NaN then leaked into InterQuartileRange, Midhinge and Trimean. Propagate the error instead, mirroring the existing EmptyInputErr handling.
This commit is contained in:
1 parent
bc246e8d16
commit
4bf1fbf3b8
2 files changed
+56
-7
No files matched your search
+28
-7
@@ -32,10 +32,22 @@ func Quartile(input Float64Data) (Quartiles, error) {
|
||||
c2 = c1 + 1
|
||||
}
|
||||
|
||||
// Find the Medians with the cutoff points
|
||||
Q1, _ := Median(copy[:c1])
|
||||
Q2, _ := Median(copy)
|
||||
Q3, _ := Median(copy[c2:])
|
||||
// Find the Medians with the cutoff points.
|
||||
// For il < 3 the lower and upper halves are empty, so Median
|
||||
// returns ErrEmptyInput; propagate it instead of silently
|
||||
// returning NaN quartiles.
|
||||
Q1, err := Median(copy[:c1])
|
||||
if err != nil {
|
||||
return Quartiles{}, err
|
||||
}
|
||||
Q2, err := Median(copy)
|
||||
if err != nil {
|
||||
return Quartiles{}, err
|
||||
}
|
||||
Q3, err := Median(copy[c2:])
|
||||
if err != nil {
|
||||
return Quartiles{}, err
|
||||
}
|
||||
|
||||
return Quartiles{Q1, Q2, Q3}, nil
|
||||
|
||||
@@ -46,7 +58,10 @@ func InterQuartileRange(input Float64Data) (float64, error) {
|
||||
if input.Len() == 0 {
|
||||
return math.NaN(), EmptyInputErr
|
||||
}
|
||||
qs, _ := Quartile(input)
|
||||
qs, err := Quartile(input)
|
||||
if err != nil {
|
||||
return math.NaN(), err
|
||||
}
|
||||
iqr := qs.Q3 - qs.Q1
|
||||
return iqr, nil
|
||||
}
|
||||
@@ -56,7 +71,10 @@ func Midhinge(input Float64Data) (float64, error) {
|
||||
if input.Len() == 0 {
|
||||
return math.NaN(), EmptyInputErr
|
||||
}
|
||||
qs, _ := Quartile(input)
|
||||
qs, err := Quartile(input)
|
||||
if err != nil {
|
||||
return math.NaN(), err
|
||||
}
|
||||
mh := (qs.Q1 + qs.Q3) / 2
|
||||
return mh, nil
|
||||
}
|
||||
@@ -68,7 +86,10 @@ func Trimean(input Float64Data) (float64, error) {
|
||||
}
|
||||
|
||||
c := sortedCopy(input)
|
||||
q, _ := Quartile(c)
|
||||
q, err := Quartile(c)
|
||||
if err != nil {
|
||||
return math.NaN(), err
|
||||
}
|
||||
|
||||
return (q.Q1 + (q.Q2 * 2) + q.Q3) / 4, nil
|
||||
}
|
||||
Reference in new issue
Block a user