创建线性模型时如何指定分类变量?含交互项模型构建咨询
解决分类变量交互项的写法问题
这个问题出在你引用分类变量水平的方式不对——R没法识别你写的Age.CategorySenior这种拼接后的变量名,而且分类变量的水平里还有空格(比如Middle Age),直接写会报错。下面给你两种可行的解决办法:
方法一:用I()函数生成临时指示变量
先确保Age.Category是因子类型(如果还不是的话),然后在模型公式里直接用条件判断生成临时的0-1变量来指定特定水平的交互:
# 转换为因子(如果数据中还不是的话) bodyfat$Age.Category <- factor(bodyfat$Age.Category) # 正确的模型写法 myModel <- lm(Brozek ~ Weight + I(Age.Category == "Senior"):Thigh + I(Age.Category == "Middle Age"):Forearm + I(Age.Category == "Senior"):Wrist + Weight:Thigh + Abdomen:Thigh + Abdomen:Wrist, data = bodyfat)
I(Age.Category == "Senior")会生成一个临时变量:当观测属于Senior水平时取值1,其他情况为0,这样就能和Thigh正确生成交互项,完美匹配你想要的逻辑。
方法二:提前创建虚拟变量(更直观)
如果你后续还要用到这些分类水平的交互,可以提前手动创建0-1虚拟变量,之后写模型就和普通变量一样简单:
# 创建对应水平的虚拟变量 bodyfat$Age_Senior <- ifelse(bodyfat$Age.Category == "Senior", 1, 0) bodyfat$Age_MiddleAge <- ifelse(bodyfat$Age.Category == "Middle Age", 1, 0) # 用虚拟变量构建模型 myModel <- lm(Brozek ~ Weight + Age_Senior:Thigh + Age_MiddleAge:Forearm + Age_Senior:Wrist + Weight:Thigh + Abdomen:Thigh + Abdomen:Wrist, data = bodyfat)
补充说明
如果你的模型需要包含Age.Category的主效应,记得在公式里加上Age.Category(比如Brozek ~ Weight + Age.Category + ...),不过看你的原需求里没提这个,所以上面的写法保持和你最初的逻辑一致。
内容的提问来源于stack exchange,提问作者user3577478
相关产品推荐
相关产品推荐

