[R] Using predict() After Adding a Factor to a glm.nb() Model

077315q at acadiau.ca 077315q at acadiau.ca
Sat Sep 8 21:47:27 CEST 2012


# Hello,

# I have a data set that looks something like the following:

site<-c(rep('a',5),rep('b',2),rep('c',4),rep('d',11))
year<-c(1980, 1981, 1982, 1993, 1995, 1980, 1983, 1981, 1993, 1995,  
1999, c(1980:1990))
count<-c(60,35,36,12,8,112,98,20,13,15,15,65,43,49,51,34,33,33,33,40,11,0)

data<-data.frame(site, year, count)

# > site year count
# 1     a 1980    60
# 2     a 1981    35
# 3     a 1982    36
# 4     a 1993    12
# .
# .
# .

# I ran a negative binomial glm using:

library(MASS)
model_a<-glm.nb(count~year, data=data)

# then extracted predicted values using:

py<-data.frame(seq(from=min(data$year), to=max(data$year), by=1))
p1<-predict(model_a, newdata=py, se.fit=TRUE, type='response')
f1<-p1$fit

plot(count~year, data=data)
lines(py$year, f1)

# Works perfectly.

# Now, I want to add site as a factor:
model_b<-glm.nb(count~year+as.factor(site), data=data)

# I have tried a couple different ways of predicting the values based  
on model_b, but am having trouble.

py<-data.frame(seq(from=min(data$year), to=max(data$year), by=1))
p1<-predict(model_b, newdata=py, se.fit=TRUE, type='response')

# gives:
# >Error in model.frame.default(Terms, newdata, na.action = na.action,  
xlev = object$xlevels) :
#   variable lengths differ (found for 'as.factor(site)')
# In addition: Warning message:
# 'newdata' had 20 rows but variable(s) found have 22 rows

py<-expand.grid(data$site, data$year)
names(py)<-c('site','year')
p1<-predict(model_b, newdata=py)

# This works, but results in 484 values, and I can't plot a line over  
my points.

# There is probably a simple solution, but I'm having trouble wrapping  
my mind around it. Mind you, this is also a last
# minute change to my thesis, and I haven't slept in about three days.

# Any suggestions? I would be extremely grateful...

# Banging my head against the wall,
# A stressed out grad student



More information about the R-help mailing list