[R] passing an extra argument to an S3 generic

Michael Friendly friendly at yorku.ca
Thu Feb 9 21:42:00 CET 2012


I'm trying to write some functions extending influence measures to 
multivariate linear models and also
allow subsets of size m>=1 to be considered for deletion diagnostics.  
I'd like these to work roughly parallel
to those functions for the univariate lm where only single case deletion 
(m=1) diagnostics are considered.

Corresponding to stats::hatvalues.lm, the S3 method for class "lm" objects,

 > hatvalues <-function (model, ...)
UseMethod("hatvalues")

 > hatvalues.lm <-
function (model, infl = lm.influence(model, do.coef = FALSE),    ...)
{
     hat <- infl$hat
     names(hat) <- names(infl$wt.res)
     hat
}

I have, for class "mlm" objects

hatvalues.mlm <- function(model, m=1, infl=mlm.influence(model, m=m, 
do.coef = FALSE), ...)
{
     hat <- infl$H
     m <- infl$m
     names(hat) <- if(m==1) infl$subsets else apply(infl$subsets,1, 
paste, collapse=',')
     hat
}

where mlm.influence() does the calculations, but also allows the m= 
argument to specify subset size.
Yet when I test this I can't seem to pass the m= argument directly, so 
that it gets stuffed in to the infl=
call to mlm.influence.

# fit an mlm
library(heplots)
Rohwer2 <- subset(Rohwer, subset=group==2)
rownames(Rohwer2)<- 1:nrow(Rohwer2)
Rohwer.mod <- lm(cbind(SAT, PPVT, Raven) ~ n+s+ns+na+ss, data=Rohwer2)

 > class(Rohwer.mod)
[1] "mlm" "lm"


## this doesn't work, as I would like it to, calling the hatvalues.mlm 
method, but passing m=2:
 > hatvalues(Rohwer.mod, m=2)
Error in UseMethod("hatvalues") :
   no applicable method for 'hatvalues' applied to an object of class 
"c('double', 'numeric')"

I don't understand why this doesn't just call hatvalues.mlm, since 
Rohwer.mod is of class "mlm".

# These work -- calling hatvalues.mlm explicitly, or passing the infl= 
argument with the call to
# mlm.influence
 > hatvalues.mlm(Rohwer.mod, m=2)
 > hatvalues(Rohwer.mod, infl=mlm.influence(Rohwer.mod,m=2))

Can someone help me understand what is wrong and how to make the .mlm 
method allow m= to be passed
directly to the infl= computation?

thx,
-Michael

-- 
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept.
York University      Voice: 416 736-5115 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA



More information about the R-help mailing list