如何从R语言nnet包的multinom()模型中获取线性预测值(linear predictor)
如何从R语言nnet包的multinom()模型中获取线性预测值(linear predictor)
嘿,我明白你的困扰!nnet包的multinom()确实不像glm系列模型那样直接支持type="link"参数来获取线性预测值,不过我们有几种靠谱的方法可以手动计算出来,下面就结合你给出的示例代码详细说说:
方法一:利用模型系数和设计矩阵直接计算
multinom()模型的系数可以通过coef()提取,我们只需要把设计矩阵和对应类别的系数做矩阵乘法,就能得到线性预测值。步骤如下:
require(nnet) require(rms) data(mtcars) # 建议用data()代替attach,避免环境变量混乱 # 构建模型 car <- multinom(gear ~ am + cyl + rcs(mpg, 4), data = mtcars) # 1. 提取每个类别相对于参考类的系数 coefs <- coef(car) # 注:这里的参考类是gear的第一个水平(mtcars里gear的水平是3、4、5,参考类为3) # 2. 获取模型对应的设计矩阵(包含所有自变量和截距项) X <- model.matrix(car) # 3. 计算线性预测值:设计矩阵 × 系数的转置 lin_pred <- X %*% t(coefs) # 查看结果,每行对应一个样本,每列对应非参考类的线性预测值 head(lin_pred)
方法二:从预测概率逆推线性预测值
多分类模型的线性预测值本质是当前类别概率与参考类别概率的对数比值,所以我们可以先获取预测概率,再通过对数变换逆推出线性预测值:
# 1. 获取所有类别的预测概率 probs <- predict(car, type = "probs") # 2. 确定参考类对应的列(这里参考类是gear=3,对应概率矩阵的第一列) ref_col <- which(colnames(probs) == as.character(sort(unique(mtcars$gear))[1])) # 3. 计算对数比值,得到线性预测值 lin_pred <- log(probs[, -ref_col] / probs[, ref_col]) # 查看结果 head(lin_pred)
这两种方法得到的结果是完全一致的,你可以根据自己的习惯选择使用。另外提醒一下:如果你的gear是因子类型,参考类是因子的第一个水平;如果是数值型,multinom()会自动将其转为因子,参考类为升序排列的第一个值。
备注:内容来源于stack exchange,提问作者andyroo
相关产品推荐
相关产品推荐

