r的lmm模型如何不将期待产出的水平设置为基准变量?

我用r做lmm模型,对1个具有3个水平的固定因子的原始数据进行了宽转长的操作。但是我的结果默认将其中一个水平的固定因子作为分类变量处理了,该怎么办?

data2 <- speed%>%pivot_longer(4:6,names_to='strategy', values_to='Speed')%>% filter(Speed>0)
dummies <- model.matrix(~ as.numeric(data2$strategy == "Conventionally.indirect.strategy.speech.rate") - 1, data = data2)
dummies <- model.matrix(~ as.numeric(data2$strategy == "Direct.strategy.speech.rate") - 1, data = data2)
dummies <- model.matrix(~ as.numeric(data2$strategy == "Non.Conventionally.indirect.strategy.speech.rate") - 1, data = data2)
data3 <- cbind(data2, dummies)
model <- lmer(Speed ~ strategy + 
                Chinese.proficiency.levels + 
                strategy:Chinese.proficiency.levels + 
                (1 | Speakers), data = data3)

在代码中,我尝试设置虚拟变量,好像没啥用,最后还是产出了2个水平。所以……求解答。

在你的代码中,产生了多个dummies变量,但是这些变量并没有在后续的模型拟合中使用。因此,无论你生成了多少个虚拟变量,最终的模型仍然会将固定因子的一个水平作为分类变量处理。
要将固定因子的所有水平都作为分类变量处理,你可以使用factor()函数将其转换为因子变量。下面是修改后的代码示例:

data2 <- speed %>%
  pivot_longer(4:6, names_to = 'strategy', values_to = 'Speed') %>%
  filter(Speed > 0)

data2$strategy <- factor(data2$strategy)  # 将strategy列转换为因子变量

model <- lmer(Speed ~ strategy + 
                Chinese.proficiency.levels + 
                strategy:Chinese.proficiency.levels + 
                (1 | Speakers), data = data2)


通过将data2$strategy列转换为因子变量,lmer()函数将会将所有水平都作为独立的分类变量处理。

请注意,转换为因子变量后,模型结果的解释可能会有所改变。因此,在使用转换后的数据进行后续分析之前,建议仔细考虑转换的影响


#非线性回归
lm.fit2 <- lm(medv ~ lstat + I(lstat^2))
summary(lm.fit2)
# 通过方差分析比较两个模型的好坏
lm.fit <- lm(medv ~ lstat)
anova(lm.fit, lm.fit2)
#绘制lm.fit2回归函数的图
par(mfrow = c(2, 2))
plot(lm.fit2)
#高阶多项式拟合
mfit5 <- lm(medv ~ poly(lstat, 5))
summary(mfit5)
# 取对数变换
logfit<-lm(medv ~ log(rm), data = Boston)
summary(logfit)

如果你使用R进行线性混合模型(LMM)分析,并希望将一个具有三个水平的固定因子作为连续变量处理,而不是分类变量,你可以使用lme4包中的re.侑旋(re.旋转)函数来旋转该因子。旋转的目的是将因子变量转换为最小投影二阶统计量,从而使它成为一个连续变量。

可以通过使用reshape()函数,将指定的因子名称设定为数值变量。

本次回答借鉴了 GPT4

在这种情况下,你需要手动指定参考级别,而不是让lmer自动选择一个。
你可以这么做:

  1. 为strategy变量创建两个虚拟变量,代表其中两个水平,第三个水平作为参考级别。例如:
dummies1 <- model.matrix(~ as.numeric(data2$strategy == "Conventionally.indirect.strategy.speech.rate") - 1, 
                        data = data2)  
dummies2 <- model.matrix(~ as.numeric(data2$strategy == "Direct.strategy.speech.rate") - 1, 
                         data = data2)

这里将Non.Conventionally.indirect.strategy.speech.rate作为参考级别。

  1. 在lmer模型中,只包含两个虚拟变量作为固定效应:
model <- lmer(Speed ~ dummies1 + dummies2 + 
                Chinese.proficiency.levels +  
                (1 | Speakers), data = data3) 
  1. 检验dummies1和dummies2的系数,来判断其他两种strategy与参考级别的差异。
    这种方法指定Non.Conventionally.indirect.strategy.speech.rate作为基准水平,dummies1和dummies2的系数代表与基准水平的差异。

另一种方法是:

  1. 为所有三个水平创建虚拟变量:
dummies1 <- model.matrix(~ as.numeric(data2$strategy == "Conventionally.indirect.strategy.speech.rate") - 1,  
                         data = data2)  
dummies2 <- model.matrix(~ as.numeric(data2$strategy == "Direct.strategy.speech.rate") - 1,   
                         data = data2)
dummies3 <- model.matrix(~ as.numeric(data2$strategy == "Non.Conventionally.indirect.strategy.speech.rate") - 1,  
                         data = data2)
  1. 在lmer中包含所有三个虚拟变量:
model <- lmer(Speed ~ dummies1 + dummies2 + dummies3 + 
                Chinese.proficiency.levels +  
                (1 | Speakers), data = data3)  
  1. lmer会自动将三个系数之一设为0。我们可以通过参数contrasts设置参考级别。例如:
contrasts(data2$strategy) <- contr.treatment(3, base = 3)

这会将第三个水平设置为参考级别。