在R中运行GAM回归出现异常错误信息求助
问题原因与解决方案
这个报错的核心问题很直接——你把因子变量直接传入了光滑函数s()中,而mgcv包的s()是为数值型变量设计的,用来拟合连续变量的非线性光滑效应,因子变量根本没法参与它内部的数值计算,这才触发了那些错误和警告。
为什么会出现这些报错?
看警告信息就能明白:
In mean.default(xx) : argument is not numeric or logical: returning NA:光滑函数需要先对变量做中心化(计算均值),但因子变量没法计算均值,返回了NA。In Ops.factor(xx, shift[i]) : ‘-’ not meaningful for factors:光滑函数内部要做数值减法运算,而因子之间的减法是没有意义的,这直接导致了后续的底层函数调用出错。
正确的处理方式
根据你的需求,有几种不同的正确建模思路:
1. 把因子作为固定线性效应(最常见的情况)
如果你的因子变量(ProviderCount、LastStage)是用来表示分组的固定效应,直接把它们放在s()外面,和普通线性模型一样:
library(mgcv) df <- structure(list(ProviderCount = structure(c(2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("0", ">0"), class = "factor"), AdmCharge = c(12889.32, 51858.43, 9957.34, 30164.17, 146750.17, 9653.39, 27547.83, 7573.13, 70912.57, 2400, 39719.79, 63282.82, 44386.1, 31832.86, 7578.46, 34729.19, 38800.62, 15985.41, 450, 24213.66), LastStage = structure(c(2L, 2L, 4L, 2L, 3L, 4L, 3L, 3L, 3L, 2L, 2L, 3L, 3L, 3L, 6L, 3L, 2L, 2L, 2L, 3L), .Label = c("1", "2", "3.1", "3.2", "4", "5"), class = "factor")), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame")) # 正确的固定效应模型 model1 <- gam(AdmCharge ~ ProviderCount + LastStage, data = df) summary(model1)
2. 对因子转换后的数值变量拟合光滑效应
如果LastStage是有序因子(比如代表疾病阶段的递进),你可以先把它转换为数值型,再拟合光滑效应:
# 将LastStage转换为数值(注意处理带小数的水平) df$LastStage_num <- as.numeric(as.character(df$LastStage)) # 拟合:ProviderCount为固定效应,LastStage_num的光滑效应 model2 <- gam(AdmCharge ~ ProviderCount + s(LastStage_num), data = df) plot(model2) # 可以查看光滑曲线
3. 拟合因子的随机效应(如果分组是随机抽样的)
如果你的因子水平是从更大的群体中抽样得到的,可以把它们作为随机效应处理,用bs = "re"指定随机效应光滑:
model3 <- gam(AdmCharge ~ s(ProviderCount, bs = "re") + s(LastStage, bs = "re"), data = df) summary(model3)
4. 让光滑效应随因子分组变化
如果想让某个数值变量的光滑效应在不同因子水平下有差异,用by参数(这里假设你有数值变量,比如如果LastStage转成数值后):
model4 <- gam(AdmCharge ~ s(LastStage_num, by = ProviderCount), data = df) plot(model4, pages = 1) # 查看不同ProviderCount下的光滑曲线
内容的提问来源于stack exchange,提问作者Omry Atia
相关产品推荐
相关产品推荐

