CRAN Package Check Results for Package robustbase

Last updated on 2026-01-30 05:51:03 CET.

Flavor Version Tinstall Tcheck Ttotal Status Flags
r-devel-linux-x86_64-debian-clang 0.99-6 27.46 274.07 301.53 OK
r-devel-linux-x86_64-debian-gcc 0.99-6 16.21 179.15 195.36 ERROR
r-devel-linux-x86_64-fedora-clang 0.99-6 44.00 460.05 504.05 ERROR
r-devel-linux-x86_64-fedora-gcc 0.99-6 43.00 458.53 501.53 ERROR
r-devel-windows-x86_64 0.99-6 37.00 351.00 388.00 OK
r-patched-linux-x86_64 0.99-6 28.13 254.78 282.91 OK
r-release-linux-x86_64 0.99-6 23.26 253.42 276.68 OK
r-release-macos-arm64 0.99-6 OK
r-release-macos-x86_64 0.99-6 19.00 263.00 282.00 OK
r-release-windows-x86_64 0.99-6 36.00 333.00 369.00 OK
r-oldrel-macos-arm64 0.99-6 OK
r-oldrel-macos-x86_64 0.99-6 18.00 261.00 279.00 OK
r-oldrel-windows-x86_64 0.99-6 38.00 419.00 457.00 OK

Additional issues

M1mac

Check Details

Version: 0.99-6
Check: tests
Result: ERROR Running ‘LTS-specials.R’ [0s/1s] Running ‘MCD-specials.R’ [0s/0s] Comparing ‘MCD-specials.Rout’ to ‘MCD-specials.Rout.save’ ... OK Running ‘MT-tst.R’ [4s/5s] Running ‘NAcoef.R’ [0s/1s] Running ‘OGK-ex.R’ [0s/1s] Comparing ‘OGK-ex.Rout’ to ‘OGK-ex.Rout.save’ ... OK Running ‘Qn-Sn-plots.R’ [1s/1s] Running ‘Rsquared.R’ [1s/1s] Comparing ‘Rsquared.Rout’ to ‘Rsquared.Rout.save’ ... OK Running ‘binom-ni-small.R’ [0s/1s] Comparing ‘binom-ni-small.Rout’ to ‘binom-ni-small.Rout.save’ ... OK Running ‘binom-no-x.R’ [0s/0s] Running ‘comedian-tst.R’ [0s/1s] Running ‘exact-fit-categorical.R’ [0s/1s] Running ‘glmrob-1.R’ [5s/6s] Running ‘glmrob-specials.R’ [0s/1s] Running ‘huber-etc.R’ [0s/1s] Comparing ‘huber-etc.Rout’ to ‘huber-etc.Rout.save’ ... OK Running ‘large-values.R’ [0s/1s] Running ‘lmrob-data.R’ [2s/2s] Running ‘lmrob-ex12.R’ [2s/3s] Running ‘lmrob-methods.R’ [0s/1s] Comparing ‘lmrob-methods.Rout’ to ‘lmrob-methods.Rout.save’ ... OK Running ‘lmrob-psifns.R’ [3s/4s] Comparing ‘lmrob-psifns.Rout’ to ‘lmrob-psifns.Rout.save’ ... OK Running ‘m-s-estimator.R’ [1s/1s] Running ‘mc-etc.R’ [1s/1s] Running ‘mc-strict.R’ [9s/10s] Running ‘nlregrob-tst.R’ [8s/9s] Running ‘nlrob-tst.R’ [2s/2s] Running ‘poisson-ex.R’ [1s/1s] Running ‘psi-rho-etc.R’ [1s/1s] Comparing ‘psi-rho-etc.Rout’ to ‘psi-rho-etc.Rout.save’ ... OK Running ‘small-sample.R’ [5s/5s] Comparing ‘small-sample.Rout’ to ‘small-sample.Rout.save’ ... OK Running ‘subsample.R’ [5s/6s] Running ‘tlts.R’ [1s/1s] Comparing ‘tlts.Rout’ to ‘tlts.Rout.save’ ... OK Running ‘tmcd.R’ [4s/5s] Running ‘weights.R’ [1s/1s] Comparing ‘weights.Rout’ to ‘weights.Rout.save’ ... OK Running ‘wgt-himed-xtra.R’ [2s/2s] Running ‘wgt-himed.R’ [0s/0s] Comparing ‘wgt-himed.Rout’ to ‘wgt-himed.Rout.save’ ... OK Running the tests in ‘tests/NAcoef.R’ failed. Complete output: > ## test handing of NA coefficients / singular fits > ## also check: > ## -- what would have to be done if class "lm" was added. > ## -- general compatibility to class lm. > require(robustbase) Loading required package: robustbase > options(digits = 5)# -> higher chance of platform independence > > ## generate simple example data (almost as in ./weights.R ) > data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:3], rep=1:3) > set.seed(1) > data$y <- rnorm(nrow(data)) > ## drop all combinations of one interaction: > data <- subset(data, x1 != 'c' | (x2 != 'B' & x2 != 'C')) > ## add collinear variables > data$x3 <- rnorm(nrow(data)) > data$x4 <- rnorm(nrow(data)) > data$x5 <- data$x3 + data$x4 > ## add some NA terms > data$y[1] <- NA > data$x4[2:3] <- NA ## to test anova > > ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): > cm0 <- lm (y ~ x1*x2 + x3, data) > cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5, data) > set.seed(2) > rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data) > m3 <- lmrob(y ~ x1*x2 + x3 + x4, data) # same column space as rm1 > rm0 <- lmrob(y ~ x1*x2 + x3, data) > > ## clean version of rm1 (to check predict) > data2 <- data.frame(y=data$y[-(1:3)], rm1$x[,!is.na(rm1$coef)]) > set.seed(2) > rm1c <- lmrob(y ~ x1b + x1c + x2B + x2C + x3 + x4 + x1b:x2B + x1b:x2C, data2) > > ## add class lm to rm1 (for now) > class(rm1) <- c(class(rm1), "lm") > class(rm0) <- c(class(rm0), "lm") > > ## the full matrix (data) should be returned by model matrix (frame) > stopifnot(all.equal(model.matrix(cm1), model.matrix(rm1)), + all.equal(model.frame (cm1), model.frame (rm1))) > ## qr decomposition should be for the full data and pivots identical lm result > qr.cm1 <- qr(cm1)$qr > qr.rm1 <- rm1$qr$qr > stopifnot(NCOL(qr.rm1) == NCOL(qr.cm1), + NROW(qr.rm1) == NROW(qr.cm1), + length(rm1$qr$qraux) == length(qr(cm1)$qraux), + all.equal(rm1$qr$pivot, qr(cm1)$pivot), + all.equal(dimnames(qr.rm1),dimnames(qr.cm1))) > ## the alias function should return the same result > stopifnot(all.equal(alias(cm1), alias(rm1))) > > #### > ## these helper functions should print NAs for the dropped coefficients > print(rm1) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x3 0.4381 0.5968 0.0344 0.2012 0.1789 -0.1320 x4 x5 x1b:x2B x1c:x2B x1b:x2C x1c:x2C -0.2155 NA -1.8763 NA -0.8651 NA > summary(rm1) -> s1 > confint(rm1) -> ci1 > stopifnot(identical(is.na(coef(cm1)), apply(ci1, 1L, anyNA)), + identical(sigma(rm1), s1$ sigma), + identical(vcov(rm1, complete=FALSE), s1$ cov ), + TRUE) > > print(s1, showAlgo=FALSE) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -1.4584 -0.3556 0.0246 0.3651 1.0296 Coefficients: (3 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.4381 0.5443 0.80 0.44 x1b 0.5968 0.6423 0.93 0.38 x1c 0.0344 0.6880 0.05 0.96 x2B 0.2012 0.7164 0.28 0.79 x2C 0.1789 0.6871 0.26 0.80 x3 -0.1320 0.4155 -0.32 0.76 x4 -0.2155 0.1694 -1.27 0.24 x5 NA NA NA NA x1b:x2B -1.8763 1.2153 -1.54 0.16 x1c:x2B NA NA NA NA x1b:x2C -0.8651 0.7466 -1.16 0.28 x1c:x2C NA NA NA NA Robust residual standard error: 0.927 (3 observations deleted due to missingness) Multiple R-squared: 0.338, Adjusted R-squared: -0.251 Convergence in 15 IRWLS iterations Robustness weights: 2 weights are ~= 1. The remaining 16 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.787 0.937 0.985 0.952 0.988 0.994 > ci1 2.5 % 97.5 % (Intercept) -0.79333 1.66946 x1b -0.85607 2.04973 x1c -1.52188 1.59076 x2B -1.41948 1.82189 x2C -1.37549 1.73320 x3 -1.07182 0.80783 x4 -0.59863 0.16756 x5 NA NA x1b:x2B -4.62539 0.87283 x1c:x2B NA NA x1b:x2C -2.55391 0.82381 x1c:x2C NA NA > ## drop1 should return df = 0 > #drop1(rm1) ## drop.lm does not return valid results (yet)! > > #### > ## methods that should just drop the NA coefficients > ## m3 is actually the same as rm1, so anova should raise an error > tools::assertError(anova(rm1, m3, test="Wald")) > tools::assertError(anova(rm1, m3, test="Deviance")) > ## but comparing rm1 and rm0 should be ok > anova(rm1, rm0, test="Wald") Robust Wald Test Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.62 1 0.2 > anova(rm1, rm0, test="Deviance") Robust Deviance Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.4 1 0.24 > ## commands with single #: > ## they do (or might) not return sensible results for robust fits > ## and need to be checked again > #cooks.distance(rm1) > #deviance(rm1) > #dfbeta(rm1) > #dfbetas(rm1) > #effects(rm1) ## fails > #extractAIC(rm1) > #influence(rm1) > stopifnot(all.equal(hv1 <- hatvalues(rm1), .lmrob.hat(wqr=rm1$qr), tol=1e-15), + all.equal(hv1, stats:::hatvalues.lm(rm1), tol=1e-15), + all.equal(hat(cm1$qr), unname(hatvalues(cm1)), tol=1e-15), + all.equal(unname(hv1), hat(rm1$qr), tol=1e-15), + ## ditto : + all.equal(hv1c <- hatvalues(rm1c), stats:::hatvalues.lm(rm1c), tol=1e-15)) Error in match.arg(type) : 'arg' should be one of "prior", "robustness" Calls: stopifnot ... weighted.residuals -> weights -> weights.lmrob -> match.arg Execution halted Flavor: r-devel-linux-x86_64-debian-gcc

Version: 0.99-6
Check: tests
Result: ERROR Running ‘LTS-specials.R’ Running ‘MCD-specials.R’ Comparing ‘MCD-specials.Rout’ to ‘MCD-specials.Rout.save’ ... OK Running ‘MT-tst.R’ [12s/26s] Running ‘NAcoef.R’ Running ‘OGK-ex.R’ Comparing ‘OGK-ex.Rout’ to ‘OGK-ex.Rout.save’ ... OK Running ‘Qn-Sn-plots.R’ Running ‘Rsquared.R’ Comparing ‘Rsquared.Rout’ to ‘Rsquared.Rout.save’ ... OK Running ‘binom-ni-small.R’ Comparing ‘binom-ni-small.Rout’ to ‘binom-ni-small.Rout.save’ ... OK Running ‘binom-no-x.R’ Running ‘comedian-tst.R’ Running ‘exact-fit-categorical.R’ Running ‘glmrob-1.R’ [14s/33s] Running ‘glmrob-specials.R’ Running ‘huber-etc.R’ Comparing ‘huber-etc.Rout’ to ‘huber-etc.Rout.save’ ... OK Running ‘large-values.R’ Running ‘lmrob-data.R’ [5s/14s] Running ‘lmrob-ex12.R’ [4s/11s] Running ‘lmrob-methods.R’ Comparing ‘lmrob-methods.Rout’ to ‘lmrob-methods.Rout.save’ ... OK Running ‘lmrob-psifns.R’ [7s/17s] Comparing ‘lmrob-psifns.Rout’ to ‘lmrob-psifns.Rout.save’ ... OK Running ‘m-s-estimator.R’ Running ‘mc-etc.R’ Running ‘mc-strict.R’ [26s/67s] Running ‘nlregrob-tst.R’ [29s/81s] Running ‘nlrob-tst.R’ [4s/14s] Running ‘poisson-ex.R’ Running ‘psi-rho-etc.R’ Comparing ‘psi-rho-etc.Rout’ to ‘psi-rho-etc.Rout.save’ ... OK Running ‘small-sample.R’ [15s/35s] Comparing ‘small-sample.Rout’ to ‘small-sample.Rout.save’ ... OK Running ‘subsample.R’ [10s/24s] Running ‘tlts.R’ Comparing ‘tlts.Rout’ to ‘tlts.Rout.save’ ... OK Running ‘tmcd.R’ [11s/33s] Running ‘weights.R’ Comparing ‘weights.Rout’ to ‘weights.Rout.save’ ... OK Running ‘wgt-himed-xtra.R’ [4s/12s] Running ‘wgt-himed.R’ Comparing ‘wgt-himed.Rout’ to ‘wgt-himed.Rout.save’ ... OK Running the tests in ‘tests/NAcoef.R’ failed. Complete output: > ## test handing of NA coefficients / singular fits > ## also check: > ## -- what would have to be done if class "lm" was added. > ## -- general compatibility to class lm. > require(robustbase) Loading required package: robustbase > options(digits = 5)# -> higher chance of platform independence > > ## generate simple example data (almost as in ./weights.R ) > data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:3], rep=1:3) > set.seed(1) > data$y <- rnorm(nrow(data)) > ## drop all combinations of one interaction: > data <- subset(data, x1 != 'c' | (x2 != 'B' & x2 != 'C')) > ## add collinear variables > data$x3 <- rnorm(nrow(data)) > data$x4 <- rnorm(nrow(data)) > data$x5 <- data$x3 + data$x4 > ## add some NA terms > data$y[1] <- NA > data$x4[2:3] <- NA ## to test anova > > ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): > cm0 <- lm (y ~ x1*x2 + x3, data) > cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5, data) > set.seed(2) > rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data) > m3 <- lmrob(y ~ x1*x2 + x3 + x4, data) # same column space as rm1 > rm0 <- lmrob(y ~ x1*x2 + x3, data) > > ## clean version of rm1 (to check predict) > data2 <- data.frame(y=data$y[-(1:3)], rm1$x[,!is.na(rm1$coef)]) > set.seed(2) > rm1c <- lmrob(y ~ x1b + x1c + x2B + x2C + x3 + x4 + x1b:x2B + x1b:x2C, data2) > > ## add class lm to rm1 (for now) > class(rm1) <- c(class(rm1), "lm") > class(rm0) <- c(class(rm0), "lm") > > ## the full matrix (data) should be returned by model matrix (frame) > stopifnot(all.equal(model.matrix(cm1), model.matrix(rm1)), + all.equal(model.frame (cm1), model.frame (rm1))) > ## qr decomposition should be for the full data and pivots identical lm result > qr.cm1 <- qr(cm1)$qr > qr.rm1 <- rm1$qr$qr > stopifnot(NCOL(qr.rm1) == NCOL(qr.cm1), + NROW(qr.rm1) == NROW(qr.cm1), + length(rm1$qr$qraux) == length(qr(cm1)$qraux), + all.equal(rm1$qr$pivot, qr(cm1)$pivot), + all.equal(dimnames(qr.rm1),dimnames(qr.cm1))) > ## the alias function should return the same result > stopifnot(all.equal(alias(cm1), alias(rm1))) > > #### > ## these helper functions should print NAs for the dropped coefficients > print(rm1) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x3 0.4381 0.5968 0.0344 0.2012 0.1789 -0.1320 x4 x5 x1b:x2B x1c:x2B x1b:x2C x1c:x2C -0.2155 NA -1.8763 NA -0.8651 NA > summary(rm1) -> s1 > confint(rm1) -> ci1 > stopifnot(identical(is.na(coef(cm1)), apply(ci1, 1L, anyNA)), + identical(sigma(rm1), s1$ sigma), + identical(vcov(rm1, complete=FALSE), s1$ cov ), + TRUE) > > print(s1, showAlgo=FALSE) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -1.4584 -0.3556 0.0246 0.3651 1.0296 Coefficients: (3 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.4381 0.5443 0.80 0.44 x1b 0.5968 0.6423 0.93 0.38 x1c 0.0344 0.6880 0.05 0.96 x2B 0.2012 0.7164 0.28 0.79 x2C 0.1789 0.6871 0.26 0.80 x3 -0.1320 0.4155 -0.32 0.76 x4 -0.2155 0.1694 -1.27 0.24 x5 NA NA NA NA x1b:x2B -1.8763 1.2153 -1.54 0.16 x1c:x2B NA NA NA NA x1b:x2C -0.8651 0.7466 -1.16 0.28 x1c:x2C NA NA NA NA Robust residual standard error: 0.927 (3 observations deleted due to missingness) Multiple R-squared: 0.338, Adjusted R-squared: -0.251 Convergence in 15 IRWLS iterations Robustness weights: 2 weights are ~= 1. The remaining 16 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.787 0.937 0.985 0.952 0.988 0.994 > ci1 2.5 % 97.5 % (Intercept) -0.79333 1.66946 x1b -0.85607 2.04973 x1c -1.52188 1.59076 x2B -1.41948 1.82189 x2C -1.37549 1.73320 x3 -1.07182 0.80783 x4 -0.59863 0.16756 x5 NA NA x1b:x2B -4.62539 0.87283 x1c:x2B NA NA x1b:x2C -2.55391 0.82381 x1c:x2C NA NA > ## drop1 should return df = 0 > #drop1(rm1) ## drop.lm does not return valid results (yet)! > > #### > ## methods that should just drop the NA coefficients > ## m3 is actually the same as rm1, so anova should raise an error > tools::assertError(anova(rm1, m3, test="Wald")) > tools::assertError(anova(rm1, m3, test="Deviance")) > ## but comparing rm1 and rm0 should be ok > anova(rm1, rm0, test="Wald") Robust Wald Test Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.62 1 0.2 > anova(rm1, rm0, test="Deviance") Robust Deviance Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.4 1 0.24 > ## commands with single #: > ## they do (or might) not return sensible results for robust fits > ## and need to be checked again > #cooks.distance(rm1) > #deviance(rm1) > #dfbeta(rm1) > #dfbetas(rm1) > #effects(rm1) ## fails > #extractAIC(rm1) > #influence(rm1) > stopifnot(all.equal(hv1 <- hatvalues(rm1), .lmrob.hat(wqr=rm1$qr), tol=1e-15), + all.equal(hv1, stats:::hatvalues.lm(rm1), tol=1e-15), + all.equal(hat(cm1$qr), unname(hatvalues(cm1)), tol=1e-15), + all.equal(unname(hv1), hat(rm1$qr), tol=1e-15), + ## ditto : + all.equal(hv1c <- hatvalues(rm1c), stats:::hatvalues.lm(rm1c), tol=1e-15)) Error in match.arg(type) : 'arg' should be one of "prior", "robustness" Calls: stopifnot ... weighted.residuals -> weights -> weights.lmrob -> match.arg Execution halted Flavor: r-devel-linux-x86_64-fedora-clang

Version: 0.99-6
Check: tests
Result: ERROR Running ‘LTS-specials.R’ Running ‘MCD-specials.R’ Comparing ‘MCD-specials.Rout’ to ‘MCD-specials.Rout.save’ ... OK Running ‘MT-tst.R’ [12s/31s] Running ‘NAcoef.R’ Running ‘OGK-ex.R’ Comparing ‘OGK-ex.Rout’ to ‘OGK-ex.Rout.save’ ... OK Running ‘Qn-Sn-plots.R’ Running ‘Rsquared.R’ Comparing ‘Rsquared.Rout’ to ‘Rsquared.Rout.save’ ... OK Running ‘binom-ni-small.R’ Comparing ‘binom-ni-small.Rout’ to ‘binom-ni-small.Rout.save’ ... OK Running ‘binom-no-x.R’ Running ‘comedian-tst.R’ Running ‘exact-fit-categorical.R’ Running ‘glmrob-1.R’ [14s/29s] Running ‘glmrob-specials.R’ Running ‘huber-etc.R’ Comparing ‘huber-etc.Rout’ to ‘huber-etc.Rout.save’ ... OK Running ‘large-values.R’ Running ‘lmrob-data.R’ Running ‘lmrob-ex12.R’ Running ‘lmrob-methods.R’ Comparing ‘lmrob-methods.Rout’ to ‘lmrob-methods.Rout.save’ ... OK Running ‘lmrob-psifns.R’ [6s/21s] Comparing ‘lmrob-psifns.Rout’ to ‘lmrob-psifns.Rout.save’ ... OK Running ‘m-s-estimator.R’ Running ‘mc-etc.R’ Running ‘mc-strict.R’ [27s/82s] Running ‘nlregrob-tst.R’ [27s/75s] Running ‘nlrob-tst.R’ [4s/11s] Running ‘poisson-ex.R’ Running ‘psi-rho-etc.R’ Comparing ‘psi-rho-etc.Rout’ to ‘psi-rho-etc.Rout.save’ ... OK Running ‘small-sample.R’ [14s/36s] Comparing ‘small-sample.Rout’ to ‘small-sample.Rout.save’ ... OK Running ‘subsample.R’ [9s/25s] Running ‘tlts.R’ Comparing ‘tlts.Rout’ to ‘tlts.Rout.save’ ... OK Running ‘tmcd.R’ [10s/28s] Running ‘weights.R’ Comparing ‘weights.Rout’ to ‘weights.Rout.save’ ... OK Running ‘wgt-himed-xtra.R’ Running ‘wgt-himed.R’ Comparing ‘wgt-himed.Rout’ to ‘wgt-himed.Rout.save’ ... OK Running the tests in ‘tests/NAcoef.R’ failed. Complete output: > ## test handing of NA coefficients / singular fits > ## also check: > ## -- what would have to be done if class "lm" was added. > ## -- general compatibility to class lm. > require(robustbase) Loading required package: robustbase > options(digits = 5)# -> higher chance of platform independence > > ## generate simple example data (almost as in ./weights.R ) > data <- expand.grid(x1=letters[1:3], x2=LETTERS[1:3], rep=1:3) > set.seed(1) > data$y <- rnorm(nrow(data)) > ## drop all combinations of one interaction: > data <- subset(data, x1 != 'c' | (x2 != 'B' & x2 != 'C')) > ## add collinear variables > data$x3 <- rnorm(nrow(data)) > data$x4 <- rnorm(nrow(data)) > data$x5 <- data$x3 + data$x4 > ## add some NA terms > data$y[1] <- NA > data$x4[2:3] <- NA ## to test anova > > ## Classical models start with 'cm', robust just with 'rm' (or just 'm'): > cm0 <- lm (y ~ x1*x2 + x3, data) > cm1 <- lm (y ~ x1*x2 + x3 + x4 + x5, data) > set.seed(2) > rm1 <- lmrob(y ~ x1*x2 + x3 + x4 + x5, data) > m3 <- lmrob(y ~ x1*x2 + x3 + x4, data) # same column space as rm1 > rm0 <- lmrob(y ~ x1*x2 + x3, data) > > ## clean version of rm1 (to check predict) > data2 <- data.frame(y=data$y[-(1:3)], rm1$x[,!is.na(rm1$coef)]) > set.seed(2) > rm1c <- lmrob(y ~ x1b + x1c + x2B + x2C + x3 + x4 + x1b:x2B + x1b:x2C, data2) > > ## add class lm to rm1 (for now) > class(rm1) <- c(class(rm1), "lm") > class(rm0) <- c(class(rm0), "lm") > > ## the full matrix (data) should be returned by model matrix (frame) > stopifnot(all.equal(model.matrix(cm1), model.matrix(rm1)), + all.equal(model.frame (cm1), model.frame (rm1))) > ## qr decomposition should be for the full data and pivots identical lm result > qr.cm1 <- qr(cm1)$qr > qr.rm1 <- rm1$qr$qr > stopifnot(NCOL(qr.rm1) == NCOL(qr.cm1), + NROW(qr.rm1) == NROW(qr.cm1), + length(rm1$qr$qraux) == length(qr(cm1)$qraux), + all.equal(rm1$qr$pivot, qr(cm1)$pivot), + all.equal(dimnames(qr.rm1),dimnames(qr.cm1))) > ## the alias function should return the same result > stopifnot(all.equal(alias(cm1), alias(rm1))) > > #### > ## these helper functions should print NAs for the dropped coefficients > print(rm1) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Coefficients: (Intercept) x1b x1c x2B x2C x3 0.4381 0.5968 0.0344 0.2012 0.1789 -0.1320 x4 x5 x1b:x2B x1c:x2B x1b:x2C x1c:x2C -0.2155 NA -1.8763 NA -0.8651 NA > summary(rm1) -> s1 > confint(rm1) -> ci1 > stopifnot(identical(is.na(coef(cm1)), apply(ci1, 1L, anyNA)), + identical(sigma(rm1), s1$ sigma), + identical(vcov(rm1, complete=FALSE), s1$ cov ), + TRUE) > > print(s1, showAlgo=FALSE) Call: lmrob(formula = y ~ x1 * x2 + x3 + x4 + x5, data = data) \--> method = "MM" Residuals: Min 1Q Median 3Q Max -1.4584 -0.3556 0.0246 0.3651 1.0296 Coefficients: (3 not defined because of singularities) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.4381 0.5443 0.80 0.44 x1b 0.5968 0.6423 0.93 0.38 x1c 0.0344 0.6880 0.05 0.96 x2B 0.2012 0.7164 0.28 0.79 x2C 0.1789 0.6871 0.26 0.80 x3 -0.1320 0.4155 -0.32 0.76 x4 -0.2155 0.1694 -1.27 0.24 x5 NA NA NA NA x1b:x2B -1.8763 1.2153 -1.54 0.16 x1c:x2B NA NA NA NA x1b:x2C -0.8651 0.7466 -1.16 0.28 x1c:x2C NA NA NA NA Robust residual standard error: 0.927 (3 observations deleted due to missingness) Multiple R-squared: 0.338, Adjusted R-squared: -0.251 Convergence in 15 IRWLS iterations Robustness weights: 2 weights are ~= 1. The remaining 16 ones are summarized as Min. 1st Qu. Median Mean 3rd Qu. Max. 0.787 0.937 0.985 0.952 0.988 0.994 > ci1 2.5 % 97.5 % (Intercept) -0.79333 1.66946 x1b -0.85607 2.04973 x1c -1.52188 1.59076 x2B -1.41948 1.82189 x2C -1.37549 1.73320 x3 -1.07182 0.80783 x4 -0.59863 0.16756 x5 NA NA x1b:x2B -4.62539 0.87283 x1c:x2B NA NA x1b:x2C -2.55391 0.82381 x1c:x2C NA NA > ## drop1 should return df = 0 > #drop1(rm1) ## drop.lm does not return valid results (yet)! > > #### > ## methods that should just drop the NA coefficients > ## m3 is actually the same as rm1, so anova should raise an error > tools::assertError(anova(rm1, m3, test="Wald")) > tools::assertError(anova(rm1, m3, test="Deviance")) > ## but comparing rm1 and rm0 should be ok > anova(rm1, rm0, test="Wald") Robust Wald Test Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.62 1 0.2 > anova(rm1, rm0, test="Deviance") Robust Deviance Table Model 1: y ~ x1 * x2 + x3 + x4 + x5 Model 2: y ~ x1 * x2 + x3 Largest model fitted by lmrob(), i.e. SM pseudoDf Test.Stat Df Pr(>chisq) 1 6 2 10 1.4 1 0.24 > ## commands with single #: > ## they do (or might) not return sensible results for robust fits > ## and need to be checked again > #cooks.distance(rm1) > #deviance(rm1) > #dfbeta(rm1) > #dfbetas(rm1) > #effects(rm1) ## fails > #extractAIC(rm1) > #influence(rm1) > stopifnot(all.equal(hv1 <- hatvalues(rm1), .lmrob.hat(wqr=rm1$qr), tol=1e-15), + all.equal(hv1, stats:::hatvalues.lm(rm1), tol=1e-15), + all.equal(hat(cm1$qr), unname(hatvalues(cm1)), tol=1e-15), + all.equal(unname(hv1), hat(rm1$qr), tol=1e-15), + ## ditto : + all.equal(hv1c <- hatvalues(rm1c), stats:::hatvalues.lm(rm1c), tol=1e-15)) Error in match.arg(type) : 'arg' should be one of "prior", "robustness" Calls: stopifnot ... weighted.residuals -> weights -> weights.lmrob -> match.arg Execution halted Flavor: r-devel-linux-x86_64-fedora-gcc