Benjamin Barnes
2008-Dec-19 11:02 UTC
[R] "parm" argument in confint.multinom () nnet package
Dear R users, The nnet package includes the multinom method for the confint function. The R Help file (?confint) for the generic function in the stats package and the help files for the glm and nls methods in the MASS package indicate that one can use the "parm" argument as "a specification of which parameters are to be given confidence intervals, either a vector of numbers or a vector of names. If missing, all parameters are considered." Although the confint.multinom() function in the nnet package accepts the "parm" argument, it doesn't appear to offer this functionality if there are more than two response categories. Since this method isn't documented, maybe I shouldn't expect it to, but there seems to be a simple solution. Compare: library(MASS) example(birthwt) (bwt.mu <- multinom(low ~ ., bwt)) confint(bwt.mu,"age") with (bwt.mu2 <- multinom(race ~ ., bwt)) confint(bwt.mu2,"age") It looks like John Fox has something going on R-Forge regarding another version of the confint.multinom() function (http://r-forge.r-project.org/plugins/scmsvn/viewcvs.php/*checkout*/pkg/R/utilities.R?rev=2&root=rcmdr <http://r-forge.r-project.org/plugins/scmsvn/viewcvs.php/*checkout*/pkg/R/utilities.R?rev=2&root=rcmdr>). However, with a few minor changes, the function in the nnet package could work as I had expected it to: confint.mult<-function (object, parm, level = 0.95, ...) { cf <- coef(object) pnames <- if (is.matrix(cf)) colnames(cf) else names(cf) if (missing(parm)) parm <- seq_along(pnames) else if (is.character(parm)) parm <- match(parm, pnames, nomatch = 0) a <- (1 - level)/2 a <- c(a, 1 - a) pct <- paste(round(100 * a, 1), "%") fac <- qnorm(a) if (is.matrix(cf)) { ## Ensure that ses and cf remain matrices after parameter selection. ## Otherwise they may turn into numeric vectors. ses <- matrix(sqrt(diag(vcov(object))), ncol = ncol(cf), byrow = TRUE)[, parm, drop = FALSE] cf <- cf[, parm, drop = FALSE] ## Move step to create ci to after redefinition of cf. ci <- array(NA, dim = c(dim(cf), 2), dimnames = c(dimnames(cf), list(pct))) ci[, , 1] <- cf + ses * fac[1] ci[, , 2] <- cf + ses * fac[2] aperm(ci, c(2, 3, 1)) } else { ci <- array(NA, dim = c(length(parm), 2), dimnames = list(pnames[parm], pct)) ses <- sqrt(diag(vcov(object)))[parm] ci[] <- cf[parm] + ses %o% fac ci } } confint.mult(bwt.mu2,"age") Would it be possible to update the code in the nnet package? Or have I missed a point somewhere? Kind regards, -Ben Barnes Doctoral Student Research Group Environmental Epidemiology German Cancer Research Center [[alternative HTML version deleted]]