Have you considered replacing the offending factor with explicit
coding of your own choosing? See "?contr.helmert" and in
library(MASS)
"contr.sdif" plus the "contrasts" attribute in
"options", obtained,
e.g., via 'options("contrasts")'. Every k-level factor is by
default
converted into a set of (k-1) columns of numeric codes. The exact
numbers do not matter to p values obtained from anova, though they will
matter to the coefficients estimated.
Have you tried something like the following with "glm.nb":
> set.seed(1)
> DF <- data.frame(a=sample(letters[1:3], 30, replace=TRUE),
+ b=sample(LETTERS[1:3], 30, replace=TRUE),
+ y=rnorm(30))
> with(DF, table(a, b))
b
a A B C
a 3 3 3
b 2 6 3
c 2 4 4
> fit1 <- lm(y~a+b, DF[DF$a!="a",])
> fit1$contrasts
$a
[1] "contr.treatment"
$b
[1] "contr.treatment"
> options(contrasts=c(unordered="contr.helmert",
ordered="contr.poly"))
> fit2 <- lm(y~a+b, DF[DF$a!="a",])
> fit2$contrasts
$a
[1] "contr.helmert"
$b
[1] "contr.helmert"
> anova(fit1)
Analysis of Variance Table
Response: y
Df Sum Sq Mean Sq F value Pr(>F)
a 1 0.0008 0.0008 0.0015 0.9698
b 2 0.6186 0.3093 0.5775 0.5719
Residuals 17 9.1050 0.5356
> anova(fit2)
Analysis of Variance Table
Response: y
Df Sum Sq Mean Sq F value Pr(>F)
a 1 0.0008 0.0008 0.0015 0.9698
b 2 0.6186 0.3093 0.5775 0.5719
Residuals 17 9.1050 0.5356
>
spencer graves
K. Steinmann wrote:
> Dear R-helpers,
>
> I try to perform glm's with negative binomial distributed data.
> So I use the MASS library and the commands:
> model_1 = glm.nb(response ~ y1 + y2 + ...+ yi, data = data.frame)
> and
> predict(model_1, newdata = data.frame)
>
>
> So far, I think everything should be ok.
>
> But when I want to perform a glm with a subset of the data,
> I run into an error message as soon as I want to predict values, based on
the
> new model. The problem seems to be the reduced number of levels of one of
the
> factors yi ( a categorical factor) in the subset of the original data set.
>
> On cran search I found some related hint, that the line
"mf$drop.unused.levels
> <- TRUE " in the glm (or glm.nb) function could cause the problem.
>
> Therefore I changed the line to "mf$drop.unused.levels <- FALSE
".
> Indeed the error message disappears and when I compare the prediction of
model_1
> with the prediction of the model, carried out with the full data set but
with
> the changed glm.nb function, I get the same predicted numbers.
>
> However, the change of glm.nb function was more of an intuitive action, and
> since I still consider myself as a beginner of R, I don't feel
comfortable.
>
> So my questions:
> 1. Is there an easier way to solve my problem?
> 2. Do I affect the glm.nb function seriously, by changing the line
mentioned
> above?
>
>
> Thank you for your help,
> Katharina
>
> PS: I am working with R 2.0.0
> PPS: Concrete error message:
> "Error in model.frame.default(Terms, newdata, na.action = na.action,
xlev > object$xlevels) :
> factor I(kanton) has new level(s) GE"
>
>
>
>
> --
> K. Steinmann
> Botanisches Institut
> Universit??t Basel
> CH-4056 Basel
> Switzerland
> Tel 0041 61 267 35 02
> E-mail: Katharina.Steinmann at stud.unibas.ch
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html
--
Spencer Graves, PhD
Senior Development Engineer
PDF Solutions, Inc.
333 West San Carlos Street Suite 700
San Jose, CA 95110, USA
spencer.graves at pdf.com
www.pdf.com <http://www.pdf.com>
Tel: 408-938-4420
Fax: 408-280-7915