我用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自动选择一个。
你可以这么做:
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作为参考级别。
model <- lmer(Speed ~ dummies1 + dummies2 +
Chinese.proficiency.levels +
(1 | Speakers), data = data3)
另一种方法是:
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)
model <- lmer(Speed ~ dummies1 + dummies2 + dummies3 +
Chinese.proficiency.levels +
(1 | Speakers), data = data3)
contrasts(data2$strategy) <- contr.treatment(3, base = 3)
这会将第三个水平设置为参考级别。