Skip to content

Commit 0d3adee

Browse files
committed
export penalties, test ridge == PLS
1 parent 5bb7c3b commit 0d3adee

File tree

3 files changed

+68
-3
lines changed

3 files changed

+68
-3
lines changed

src/RobustModels.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ export LossFunction,
117117
GeneralizedQuantileEstimator,
118118
ExpectileEstimator,
119119
L2Estimator,
120+
PenaltyFunction,
121+
NoPenalty,
122+
SquaredL2Penalty,
123+
L1Penalty,
124+
ElasticNetPenalty,
125+
EuclideanPenalty,
126+
RangedPenalties,
127+
End,
120128
DensePredCG,
121129
SparsePredCG,
122130
RidgePred,

test/ipod.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,10 @@ end
111111

112112

113113
@testset "Θ-IPOD: L2Loss method, Ridge penalty" begin
114-
rtol = 1e-3
114+
rtol = 1e-5
115115
@testset "solver method $(method)" for method in pen_methods
116116
if method === :fista
117-
rtol = 1e-1
117+
rtol = 1e-2
118118
end
119119

120120
# Formula, dense and sparse entry

test/penalties.jl

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ rng = MersenneTwister(seed)
1616

1717
t = 10 * randn(rng, 30)
1818

19-
19+
#=
2020
@testset "Methods penalty functions: $(name)" for name in ("No", penalties...)
2121
tt = copy(t)
2222
@@ -133,3 +133,60 @@ end
133133
refit!(m1)
134134
@test all(coef(m1) .== β1)
135135
end
136+
=#
137+
138+
@testset "M-estimator with penalty: Ridge" begin
139+
rtol = 1e-5
140+
pen = SquaredL2Penalty(λ)
141+
142+
kwargs = (; initial_scale=1)
143+
m0 = rlm(form, data, MEstimator{L2Loss}(); kwargs...)
144+
m1 = rlm(form, data, MEstimator{L2Loss}(); ridgeλ=λ, kwargs...)
145+
146+
@testset "solver method $(method)" for method in pen_methods
147+
if method === :fista
148+
rtol = 1e-2
149+
end
150+
151+
# Formula, dense and sparse entry
152+
@testset "data type: $(typeof(A))" for (A, b) in data_tuples
153+
name = "rlm($(pen); method=$(method)),\t"
154+
name *= if A==form; "formula" elseif A==X; "dense " else "sparse " end
155+
156+
m2 = rlm(A, b, pen; method=method, kwargs...)
157+
158+
@test all(isfinite.(coef(m2)))
159+
160+
VERBOSE && println("\n\t\u25CF $(name)")
161+
VERBOSE && println("rlm ridge : ", coef(m1))
162+
VERBOSE && println("rlm($method) $(pen) : ", coef(m2))
163+
@test isapprox(coef(m2), coef(m1); rtol=rtol)
164+
165+
# interface
166+
@testset "method: $(f)" for f in interface_methods
167+
# make sure the methods for IPODRegression give the same results as RobustLinearModel
168+
var1 = f(m1)
169+
var2 = f(m2)
170+
if f == hasformula
171+
# m1 is defined from a formula
172+
@test var2 == (A isa FormulaTerm)
173+
elseif f in (dof, dof_residual)
174+
# Ridge dof is smaller than the unpenalized regression
175+
# rlm with penalty dof is the same as the unpenalized rlm
176+
@test var2 == f(m0)
177+
elseif f in (dispersion, stderror, vcov, leverage)
178+
@test all(abs.(var2) .>= abs.(var1))
179+
elseif f in (leverage_weights,)
180+
@test all(abs.(var2) .<= abs.(var1))
181+
elseif f in (confint, )
182+
@test isapprox(var1, var2; rtol=1e-1)
183+
elseif f in (projectionmatrix, )
184+
continue
185+
else
186+
@test isapprox(var1, var2; rtol=rtol)
187+
end
188+
end
189+
end
190+
end
191+
end
192+

0 commit comments

Comments
 (0)