[RsR] Can I calculate the p-value of the robust regression at this way?
Olivier Renaud
O||v|er@Ren@ud @end|ng |rom un|ge@ch
Tue Apr 6 10:05:30 CEST 2010
Hi,
The output of lmRob DOES provide the robust version of the R-squared
under "Multiple R-Squared". It does not directly provide a test that
compares the model with the model with no covariates (equivalent of the
"F test"), but it can be obtained with the anova function as shown here:
> creat.lmRob = lmRob(original1 ~
approprie1+approprie2+creativite1+creativite2, data=creatif)
> creat00.lmRob = lmRob(original1 ~ 1, data=creatif)
> anova (creat00.lmRob, creat.lmRob)
This can also be done with lmrob().
Concerning the R-squared however, we have recently published a paper
that shows that the robust R-squared provided by lmRob is biased,
sometimes to a large extent. We provide a consistent and robust
estimator of R-squared (robR2w.WithCorrection in the output below) and a
version adjusted for the sample size (robR2w.AdjustedWithCorrection in
the output below). The code and an example are provided below.
Olivier
ref: Renaud, O. & Victoria-Feser, M.-P. (2010). A robust coefficient of
determination for regression. Journal of Statistical Planning and
Inference, 140, 1852-1862. http://dx.doi.org/10.1016/j.jspi.2010.01.008
> library(robust)
> source("robR2w.r")
> creat.lmRob = lmRob(original1 ~
approprie1+approprie2+creativite1+creativite2, data=creatif)
> summary(creat.lmRob)
Call: lmRob(formula = original1 ~ approprie1 + approprie2 + creativite1 +
creativite2, data = creatif)
Residuals:
Min 1Q Median 3Q Max
-1.96149388 -0.34543174 -0.05500626 0.23168813 1.73781067
Coefficients:
Value Std. Error t value Pr(>|t|)
(Intercept) -2.2744444543 1.2656121996 -1.7971100903 0.0784825453
approprie1 0.0914187017 0.1187669959 0.7697315322 0.4451541682
approprie2 0.1505246740 0.0934840433 1.6101643524 0.1137861853
creativite1 0.6270578015 0.1648705921 3.8033332300 0.0003963918
creativite2 -0.2384886952 0.1302348886 -1.8312197120 0.0731512215
Residual standard error: 0.459508 on 49 degrees of freedom
Multiple R-Squared: 0.183627
Test for Bias:
statistic p-value
M-estimate 6.527018 0.25825825
LS-estimate 10.368150 0.06545114
> robR2w(creat.lmRob)
$robR2w.NoCorrection
[1] 0.3732078
$robR2w.WithCorrection
[1] 0.3302368
$robR2w.AdjustedWithCorrection
[1] 0.2604698
friendpine wrote:
> The output for the rlm(),lmRob(),lmrob() didn't give the R-squared and the
> p-value of the equation. There seems to be no function that can do these
> things.Can we calculate it as in the OLS(ordinary least squared) regression? The
> method in OLS use the SSE and SSR to calculate the f for F test. The p-value
> generated in the F test is the p-value for the OLS regression equation. Can we
> do it in the robust regression?
>
> _______________________________________________
> R-SIG-Robust using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-robust
--
Olivier.Renaud using unige.ch http://www.unige.ch/fapse/mad/
Methodology & Data Analysis - Psychology Dept - University of Geneva
UniMail, Office 4164 - 40, Bd du Pont d'Arve - CH-1211 Geneva 4
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://stat.ethz.ch/pipermail/r-sig-robust/attachments/20100406/c2374888/attachment.html>
-------------- next part --------------
robR2w = function (rob.obj, correc=1.2076) {
## R2 in robust regression, see
## Renaud, O. & Victoria-Feser, M.-P. (2010). A robust coefficient of determination for regression. Journal of Statistical Planning and Inference, 140, 1852-â1862.
## rob.obj is an lmRob object. correc is the correction for consistancy. Call:
##
## library(robust)
## creat.lmRob = lmRob(original1 ~ approprie1+approprie2+creativite1+creativite2, data=creatif)
## summary(creat.lmRob)
## robR2w(creat.lmRob)
## Weights in robust regression
wt.bisquare = function(u, c = 4.685) {
U <- abs(u/c)
w <- ((1. + U) * (1. - U))^2.
w[U > 1.] <- 0.
w
}
weight.rob=function(rob.obj){
resid.rob=rob.obj$resid
scale.rob=(rob.obj$scale)*rob.obj$df.residual/length(resid.rob)
resid.rob= resid.rob/scale.rob
weight=wt.bisquare(resid.rob)
}
if (attr(rob.obj, "class") !="lmRob")
stop("This function works only on lmRob objects")
pred = rob.obj$fitted.values
resid = rob.obj$resid
resp = resid+pred
wgt = weight.rob(rob.obj)
scale.rob = rob.obj$scale
resp.mean = sum(wgt*resp)/sum(wgt)
pred.mean = sum(wgt*pred)/sum(wgt)
yMy = sum(wgt*(resp-resp.mean)^2)
rMr = sum(wgt*resid^2)
r2 = (yMy-rMr) / yMy
r2correc= (yMy-rMr) / (yMy-rMr +rMr*correc)
r2adjcor = 1-(1-r2correc) * (length(resid)-1) / (length(resid)-length(rob.obj$coefficients)-1)
return(list(robR2w.NoCorrection=r2, robR2w.WithCorrection=r2correc, robR2w.AdjustedWithCorrection=r2adjcor))
}
More information about the R-SIG-Robust
mailing list