R语言中GLM预测常见错误及负二项模型预测问题咨询
R语言GLM(含负二项模型)预测时常见错误及你的案例分析
先聊聊GLM预测时容易踩的坑,不管是普通线性回归变体还是负二项这类计数模型,这些错误都很常见:
- 变量类型不匹配:这是最容易犯的!比如你训练模型时
treatment是数值型,结果测试数据里把它转成了因子;或者age在训练集是整数,测试集变成了字符型,R直接会给你报错,说找不到匹配的变量类型。 - 缺失模型所需的自变量:如果你的负二项模型用到了
treatment和age两个变量,结果测试数据只给了age,那预测时肯定会提示缺少变量,直接跑不起来。 - 自变量取值超出训练范围:比如你训练数据里的
age范围是22到42,要是你突然预测一个10岁或者70岁的患者,虽然R不会报错,但这个预测结果完全不可信——模型没见过这么极端的数据,没法给出靠谱的估计。 - 模型本身拟合有问题:如果你的负二项模型拟合时就没收敛(比如出现奇异值警告,或者迭代次数不够),那用这个模型去预测,要么返回NA,要么给出的结果根本不对。
- 搞错预测值的尺度:GLM的
predict()默认输出的是链接函数转换后的值(负二项模型默认是log链接),不是你要的实际 seizure rate!必须加type="response"参数,才能得到原始计数尺度的预测值,这点很多新手都容易忘。 - 数据结构不兼容:虽然
tibble和普通data.frame大部分时候可以通用,但如果你的测试数据是矩阵或者其他特殊结构,偶尔会出现变量名不匹配的问题,最好统一用data.frame或者tibble来做预测数据。
再针对你的负二项模型案例来说说:
从你给出的数据结构看,epilepsy_reduced里的treatment是数值型,age是整数型,你创建的placebo_patient变量类型是匹配的,这点做得不错。
假设你是用MASS包的glm.nb()拟合的模型,比如:
library(MASS) # 假设你的模型是这样拟合的 nb_model <- glm.nb(seizure.rate ~ treatment + age, data = epilepsy_reduced)
那预测的时候一定要记得加type="response",示例代码如下:
# 预测安慰剂患者的 seizure rate predict(nb_model, newdata = placebo_patient, type = "response") # 针对progabide患者,只要把treatment设为1就行 progabide_patient <- data.frame(treatment = as.numeric(1), age = as.integer(30)) predict(nb_model, newdata = progabide_patient, type = "response")
另外还要注意:如果你的模型里还包含其他自变量(比如你没展示的交互项或者其他协变量),那测试数据里必须也包含这些变量,否则会报错。还有,如果训练时treatment是因子类型,那测试数据里也要把treatment转成因子,并且水平要和训练集一致——不过从你的数据结构看treatment是数值型,所以这部分不用操心。
内容的提问来源于stack exchange,提问作者user1607
相关产品推荐
相关产品推荐

