predict和model.matrix在因子变量

时间:2015-12-18 00:29:44

标签: r predict lme4 r-factor model.matrix

此问题产生于此处发布的另一个问题:non-conformable arguments error from lmer when trying to extract information from the model matrix

当试图从包含因子变量的lmer模型中获得预测均值时,输出会根据指数因子变量的方式而变化。

我有一个可变年龄组,可以使用“儿童<15岁”,“成人15-49岁”,“50岁以上老人”或“0-15岁”,“15-49岁”等组来指定,“50 + y”。我的选择很重要,因为对于前者,标签的字母顺序不同于级别的数字排序。为了说明这一点,我再次使用了睡眠数据。

library(lme4)
sleep <- as.data.frame(sleepstudy)   #import the sleep data

我必须为年龄创建一个变量。

set.seed(13)  #set a seed for creating a new variable, age
sleep$age <- sample(1:3,length(sleep),rep=TRUE) #create a new variable, age
sleep$agegroup1 <- factor(sleep$age, levels = c(1,2,3), 
        labels = c("Children <15 years", "Adults 15-49 years", "Elderly 50+ years"))
table(sleep$agegroup)  #should have 3 age groups

运行模型

m1 <- lmer(Reaction ~ Days + agegroup1 + Days:agegroup1 + (Days | Subject), sleep) 
summary(m1)

# New data frame for predicted means
d <- seq(0,9,1)  # make a vector of days = 0 to 9
newdat1 <- data.frame(Days=d,      
                          agegroup1=factor(rep(levels(sleep$agegroup1),length(d))))
newdat1 <- newdat1[order(newdat1$Days,newdat1$agegroup1),]   #order by Days 
mm <- model.matrix(formula(m1,fixed.only=TRUE)[-2], newdat1)  #create the matrix

现在,我尝试使用模型矩阵和预测函数输出预测均值:

newdat1$mm <- mm%*%fixef(m1)    
newdat1$predict <- predict(m1, newdata=newdat1, re.form=NA)
head(newdat1)

这里,模型矩阵和预测函数的预测平均值是不同的;成人和儿童年龄组倒置。

   Days          agegroup1       mm  predict
11    0 Adults 15-49 years 252.2658 252.8241
1     0 Children <15 years 252.8241 252.2658
21    0  Elderly 50+ years 249.1254 249.1254
2     1 Adults 15-49 years 262.3326 263.2674
22    1 Children <15 years 263.2674 262.3326
12    1  Elderly 50+ years 260.0171 260.0171

如果我使用因子标签再次运行此脚本,其字母排序与级别的数字排序相同,我会得到不同的结果:

#set new labels for agegroup
sleep$agegroup2 <- factor(sleep$age, levels = c(1,2,3), 
                        labels = c("0-15y", "15-49y", "50+y"))
m2 <- lmer(Reaction ~ Days + agegroup2 + Days:agegroup2 + (Days | Subject), sleep) 
summary(m2)

# New data frame for predicted means
d <- seq(0,9,1)  # make a vector of days = 0 to 9
newdat2 <- data.frame(Days=d,
                    agegroup2=factor(rep(levels(sleep$agegroup2),length(d))))
newdat2 <- newdat2[order(newdat2$Days,newdat2$agegroup2),]   #order by Days
mm <- model.matrix(formula(m2,fixed.only=TRUE)[-2], newdat2)
newdat2$mm <- mm%*%fixef(m2)   
newdat2$predict <- predict(m2, newdata=newdat2, re.form=NA)
head(newdat2)

这里,来自模型矩阵和预测函数的预测平均值是相同的。

   Days agegroup2       mm  predict
1     0     0-15y 252.2658 252.2658
11    0    15-49y 252.8241 252.8241
21    0      50+y 249.1254 249.1254
22    1     0-15y 262.3326 262.3326
2     1    15-49y 263.2674 263.2674
12    1      50+y 260.0171 260.0171

预测似乎忽略标签并专注于关卡,而直接访问模型矩阵则正确地关注标签。那么,我的问题是,在尝试使用模型矩阵时,是否总是需要确保因子水平和标签具有相同的顺序?或者还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

模型矩阵的列和来自模型的固定效果的列顺序必须匹配才能正确地进行矩阵乘法以“手动”计算预测值。这意味着,是的,新数据集中因子级别的顺序必须与原始数据集中的顺序相同,才能使用model.matrixfixef

您可以通过在新数据集中设置因子级别的顺序来实现此目的。通过简单地使用原始数据集中的因子级别,这是最容易做到的。例如,您可以在newdat1中执行以下操作:

factor(rep(levels(sleep$agegroup1), length(d)), levels = levels(sleep$agegroup1)))