Robust Linear Models
In [1]:
1 2 3 4 5 | <span class = "kn" > from < / span> <span class = "nn" >__future__< / span> <span class = "kn" > import < / span> <span class = "n" >print_function< / span> <span class = "kn" > import < / span> <span class = "nn" >numpy< / span> <span class = "kn" >as< / span> <span class = "nn" >np< / span> <span class = "kn" > import < / span> <span class = "nn" >statsmodels.api< / span> <span class = "kn" >as< / span> <span class = "nn" >sm< / span> <span class = "kn" > import < / span> <span class = "nn" >matplotlib.pyplot< / span> <span class = "kn" >as< / span> <span class = "nn" >plt< / span> <span class = "kn" > from < / span> <span class = "nn" >statsmodels.sandbox.regression.predstd< / span> <span class = "kn" > import < / span> <span class = "n" >wls_prediction_std< / span> |
Estimation
Load data:
In [2]:
1 2 | <span class = "n" >data< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >datasets< / span><span class = "o" >.< / span><span class = "n" >stackloss< / span><span class = "o" >.< / span><span class = "n" >load< / span><span class = "p" >()< / span> <span class = "n" >data< / span><span class = "o" >.< / span><span class = "n" >exog< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >add_constant< / span><span class = "p" >(< / span><span class = "n" >data< / span><span class = "o" >.< / span><span class = "n" >exog< / span><span class = "p" >)< / span> |
Huber's T norm with the (default) median absolute deviation scaling
In [3]:
1 2 3 4 5 6 | <span class = "n" >huber_t< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >RLM< / span><span class = "p" >(< / span><span class = "n" >data< / span><span class = "o" >.< / span><span class = "n" >endog< / span><span class = "p" >,< / span> <span class = "n" >data< / span><span class = "o" >.< / span><span class = "n" >exog< / span><span class = "p" >,< / span> <span class = "n" >M< / span><span class = "o" > = < / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >robust< / span><span class = "o" >.< / span><span class = "n" >norms< / span><span class = "o" >.< / span><span class = "n" >HuberT< / span><span class = "p" >())< / span> <span class = "n" >hub_results< / span> <span class = "o" > = < / span> <span class = "n" >huber_t< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >()< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >hub_results< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >hub_results< / span><span class = "o" >.< / span><span class = "n" >bse< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >hub_results< / span><span class = "o" >.< / span><span class = "n" >summary< / span><span class = "p" >(< / span><span class = "n" >yname< / span><span class = "o" > = < / span><span class = "s" > 'y' < / span><span class = "p" >,< / span> <span class = "n" >xname< / span><span class = "o" > = < / span><span class = "p" >[< / span><span class = "s" > 'var_</span><span class="si">%d</span><span class="s">' < / span> <span class = "o" > % < / span> <span class = "n" >i< / span> <span class = "k" > for < / span> <span class = "n" >i< / span> <span class = "ow" > in < / span> <span class = "nb" > range < / span><span class = "p" >(< / span><span class = "nb" > len < / span><span class = "p" >(< / span><span class = "n" >hub_results< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >))]))< / span> |
Huber's T norm with 'H2' covariance matrix
In [4]:
1 2 3 | <span class = "n" >hub_results2< / span> <span class = "o" > = < / span> <span class = "n" >huber_t< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >(< / span><span class = "n" >cov< / span><span class = "o" > = < / span><span class = "s" > "H2" < / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >hub_results2< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >hub_results2< / span><span class = "o" >.< / span><span class = "n" >bse< / span><span class = "p" >)< / span> |
Andrew's Wave norm with Huber's Proposal 2 scaling and 'H3' covariance matrix
In [5]:
1 2 3 | <span class = "n" >andrew_mod< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >RLM< / span><span class = "p" >(< / span><span class = "n" >data< / span><span class = "o" >.< / span><span class = "n" >endog< / span><span class = "p" >,< / span> <span class = "n" >data< / span><span class = "o" >.< / span><span class = "n" >exog< / span><span class = "p" >,< / span> <span class = "n" >M< / span><span class = "o" > = < / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >robust< / span><span class = "o" >.< / span><span class = "n" >norms< / span><span class = "o" >.< / span><span class = "n" >AndrewWave< / span><span class = "p" >())< / span> <span class = "n" >andrew_results< / span> <span class = "o" > = < / span> <span class = "n" >andrew_mod< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >(< / span><span class = "n" >scale_est< / span><span class = "o" > = < / span><span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >robust< / span><span class = "o" >.< / span><span class = "n" >scale< / span><span class = "o" >.< / span><span class = "n" >HuberScale< / span><span class = "p" >(),< / span> <span class = "n" >cov< / span><span class = "o" > = < / span><span class = "s" > "H3" < / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "s" > 'Parameters: ' < / span><span class = "p" >,< / span> <span class = "n" >andrew_results< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> |
See help(sm.RLM.fit)
for more options and module sm.robust.scale
for scale options
Comparing OLS and RLM
Artificial data with outliers:
In [6]:
1 2 3 4 5 6 7 8 9 | <span class = "n" >nsample< / span> <span class = "o" > = < / span> <span class = "mi" > 50 < / span> <span class = "n" >x1< / span> <span class = "o" > = < / span> <span class = "n" >np< / span><span class = "o" >.< / span><span class = "n" >linspace< / span><span class = "p" >(< / span><span class = "mi" > 0 < / span><span class = "p" >,< / span> <span class = "mi" > 20 < / span><span class = "p" >,< / span> <span class = "n" >nsample< / span><span class = "p" >)< / span> <span class = "n" >X< / span> <span class = "o" > = < / span> <span class = "n" >np< / span><span class = "o" >.< / span><span class = "n" >column_stack< / span><span class = "p" >((< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "p" >(< / span><span class = "n" >x1< / span><span class = "o" > - < / span><span class = "mi" > 5 < / span><span class = "p" >)< / span><span class = "o" > * * < / span><span class = "mi" > 2 < / span><span class = "p" >))< / span> <span class = "n" >X< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >add_constant< / span><span class = "p" >(< / span><span class = "n" >X< / span><span class = "p" >)< / span> <span class = "n" >sig< / span> <span class = "o" > = < / span> <span class = "mf" > 0.3 < / span> <span class = "c" > # smaller error variance makes OLS<->RLM contrast bigger</span> <span class = "n" >beta< / span> <span class = "o" > = < / span> <span class = "p" >[< / span><span class = "mi" > 5 < / span><span class = "p" >,< / span> <span class = "mf" > 0.5 < / span><span class = "p" >,< / span> <span class = "o" > - < / span><span class = "mf" > 0.0 < / span><span class = "p" >]< / span> <span class = "n" >y_true2< / span> <span class = "o" > = < / span> <span class = "n" >np< / span><span class = "o" >.< / span><span class = "n" >dot< / span><span class = "p" >(< / span><span class = "n" >X< / span><span class = "p" >,< / span> <span class = "n" >beta< / span><span class = "p" >)< / span> <span class = "n" >y2< / span> <span class = "o" > = < / span> <span class = "n" >y_true2< / span> <span class = "o" > + < / span> <span class = "n" >sig< / span><span class = "o" > * < / span><span class = "mf" > 1. < / span> <span class = "o" > * < / span> <span class = "n" >np< / span><span class = "o" >.< / span><span class = "n" >random< / span><span class = "o" >.< / span><span class = "n" >normal< / span><span class = "p" >(< / span><span class = "n" >size< / span><span class = "o" > = < / span><span class = "n" >nsample< / span><span class = "p" >)< / span> <span class = "n" >y2< / span><span class = "p" >[[< / span><span class = "mi" > 39 < / span><span class = "p" >,< / span><span class = "mi" > 41 < / span><span class = "p" >,< / span><span class = "mi" > 43 < / span><span class = "p" >,< / span><span class = "mi" > 45 < / span><span class = "p" >,< / span><span class = "mi" > 48 < / span><span class = "p" >]]< / span> <span class = "o" > - = < / span> <span class = "mi" > 5 < / span> <span class = "c" > # add some outliers (10% of nsample)</span> |
Example 1: quadratic function with linear truth
Note that the quadratic term in OLS regression will capture outlier effects.
In [7]:
1 2 3 4 | <span class = "n" >res< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >OLS< / span><span class = "p" >(< / span><span class = "n" >y2< / span><span class = "p" >,< / span> <span class = "n" >X< / span><span class = "p" >)< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >()< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >res< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >res< / span><span class = "o" >.< / span><span class = "n" >bse< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >res< / span><span class = "o" >.< / span><span class = "n" >predict< / span><span class = "p" >())< / span> |
Estimate RLM:
In [8]:
1 2 3 | <span class = "n" >resrlm< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >RLM< / span><span class = "p" >(< / span><span class = "n" >y2< / span><span class = "p" >,< / span> <span class = "n" >X< / span><span class = "p" >)< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >()< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >resrlm< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >resrlm< / span><span class = "o" >.< / span><span class = "n" >bse< / span><span class = "p" >)< / span> |
Draw a plot to compare OLS estimates to the robust estimates:
In [9]:
1 2 3 4 5 6 7 8 9 10 | <span class = "n" >fig< / span> <span class = "o" > = < / span> <span class = "n" >plt< / span><span class = "o" >.< / span><span class = "n" >figure< / span><span class = "p" >(< / span><span class = "n" >figsize< / span><span class = "o" > = < / span><span class = "p" >(< / span><span class = "mi" > 12 < / span><span class = "p" >,< / span><span class = "mi" > 8 < / span><span class = "p" >))< / span> <span class = "n" >ax< / span> <span class = "o" > = < / span> <span class = "n" >fig< / span><span class = "o" >.< / span><span class = "n" >add_subplot< / span><span class = "p" >(< / span><span class = "mi" > 111 < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >y2< / span><span class = "p" >,< / span> <span class = "s" > 'o' < / span><span class = "p" >,< / span><span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "data" < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >y_true2< / span><span class = "p" >,< / span> <span class = "s" > 'b-' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "True" < / span><span class = "p" >)< / span> <span class = "n" >prstd< / span><span class = "p" >,< / span> <span class = "n" >iv_l< / span><span class = "p" >,< / span> <span class = "n" >iv_u< / span> <span class = "o" > = < / span> <span class = "n" >wls_prediction_std< / span><span class = "p" >(< / span><span class = "n" >res< / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >res< / span><span class = "o" >.< / span><span class = "n" >fittedvalues< / span><span class = "p" >,< / span> <span class = "s" > 'r-' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "OLS" < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >iv_u< / span><span class = "p" >,< / span> <span class = "s" > 'r--' < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >iv_l< / span><span class = "p" >,< / span> <span class = "s" > 'r--' < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >resrlm< / span><span class = "o" >.< / span><span class = "n" >fittedvalues< / span><span class = "p" >,< / span> <span class = "s" > 'g.-' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "RLM" < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >legend< / span><span class = "p" >(< / span><span class = "n" >loc< / span><span class = "o" > = < / span><span class = "s" > "best" < / span><span class = "p" >)< / span> |
Out[9]:
Example 2: linear function with linear truth
Fit a new OLS model using only the linear term and the constant:
In [10]:
1 2 3 4 | <span class = "n" >X2< / span> <span class = "o" > = < / span> <span class = "n" >X< / span><span class = "p" >[:,[< / span><span class = "mi" > 0 < / span><span class = "p" >,< / span><span class = "mi" > 1 < / span><span class = "p" >]]< / span> <span class = "n" >res2< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >OLS< / span><span class = "p" >(< / span><span class = "n" >y2< / span><span class = "p" >,< / span> <span class = "n" >X2< / span><span class = "p" >)< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >()< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >res2< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >res2< / span><span class = "o" >.< / span><span class = "n" >bse< / span><span class = "p" >)< / span> |
Estimate RLM:
In [11]:
1 2 3 | <span class = "n" >resrlm2< / span> <span class = "o" > = < / span> <span class = "n" >sm< / span><span class = "o" >.< / span><span class = "n" >RLM< / span><span class = "p" >(< / span><span class = "n" >y2< / span><span class = "p" >,< / span> <span class = "n" >X2< / span><span class = "p" >)< / span><span class = "o" >.< / span><span class = "n" >fit< / span><span class = "p" >()< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >resrlm2< / span><span class = "o" >.< / span><span class = "n" >params< / span><span class = "p" >)< / span> <span class = "k" > print < / span><span class = "p" >(< / span><span class = "n" >resrlm2< / span><span class = "o" >.< / span><span class = "n" >bse< / span><span class = "p" >)< / span> |
Draw a plot to compare OLS estimates to the robust estimates:
In [12]:
1 2 3 4 5 6 7 8 9 10 | <span class = "n" >prstd< / span><span class = "p" >,< / span> <span class = "n" >iv_l< / span><span class = "p" >,< / span> <span class = "n" >iv_u< / span> <span class = "o" > = < / span> <span class = "n" >wls_prediction_std< / span><span class = "p" >(< / span><span class = "n" >res2< / span><span class = "p" >)< / span> <span class = "n" >fig< / span><span class = "p" >,< / span> <span class = "n" >ax< / span> <span class = "o" > = < / span> <span class = "n" >plt< / span><span class = "o" >.< / span><span class = "n" >subplots< / span><span class = "p" >(< / span><span class = "n" >figsize< / span><span class = "o" > = < / span><span class = "p" >(< / span><span class = "mi" > 8 < / span><span class = "p" >,< / span><span class = "mi" > 6 < / span><span class = "p" >))< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >y2< / span><span class = "p" >,< / span> <span class = "s" > 'o' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "data" < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >y_true2< / span><span class = "p" >,< / span> <span class = "s" > 'b-' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "True" < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >res2< / span><span class = "o" >.< / span><span class = "n" >fittedvalues< / span><span class = "p" >,< / span> <span class = "s" > 'r-' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "OLS" < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >iv_u< / span><span class = "p" >,< / span> <span class = "s" > 'r--' < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >iv_l< / span><span class = "p" >,< / span> <span class = "s" > 'r--' < / span><span class = "p" >)< / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >plot< / span><span class = "p" >(< / span><span class = "n" >x1< / span><span class = "p" >,< / span> <span class = "n" >resrlm2< / span><span class = "o" >.< / span><span class = "n" >fittedvalues< / span><span class = "p" >,< / span> <span class = "s" > 'g.-' < / span><span class = "p" >,< / span> <span class = "n" >label< / span><span class = "o" > = < / span><span class = "s" > "RLM" < / span><span class = "p" >)< / span> <span class = "n" >legend< / span> <span class = "o" > = < / span> <span class = "n" >ax< / span><span class = "o" >.< / span><span class = "n" >legend< / span><span class = "p" >(< / span><span class = "n" >loc< / span><span class = "o" > = < / span><span class = "s" > "best" < / span><span class = "p" >)< / span> |
Please login to continue.