使用partykit包绘制ctree时出现invalid 'yscale' in viewport错误求助
解决partykit包ctree绘图时的"invalid 'yscale' in viewport"错误
问题根源
你遇到的错误和无终端节点问题,核心原因是na.action = na.pass的设置:
- 该参数会保留所有含缺失值的观测,但
ctree在构建分裂节点时,会自动排除含缺失值的样本进行显著性检验。 airquality数据集的Ozone等变量存在大量缺失值,导致有效样本量不足,模型无法找到符合显著性要求的分裂规则,最终生成的树只有一个根节点。而plot()函数无法处理这种仅含根节点的ctree结构,因此抛出invalid 'yscale' in viewport错误。
解决方案
方案1:合理处理缺失值(推荐)
删除或插补缺失值,让模型有足够的有效样本生成分裂节点:
方法A:删除含缺失值的观测
library(partykit) data("airquality") # 清理缺失值 clean_air <- na.omit(airquality) # 重新构建模型 dumm_model <- ctree(Ozone ~ ., data = clean_air, control = ctree_control(teststat = "quadratic", testtype = "Bonferroni")) # 绘图 plot(dumm_model)
方法B:插补缺失值
如果不想删除数据,可对缺失值进行插补(以下为简单均值插补示例,实际可根据需求选择更专业的插补方法,如多重插补):
library(partykit) data("airquality") # 均值插补Ozone和Solar.R的缺失值 airquality$Ozone[is.na(airquality$Ozone)] <- mean(airquality$Ozone, na.rm = TRUE) airquality$Solar.R[is.na(airquality$Solar.R)] <- mean(airquality$Solar.R, na.rm = TRUE) # 构建模型并绘图 dumm_model <- ctree(Ozone ~ ., data = airquality, control = ctree_control(teststat = "quadratic", testtype = "Bonferroni")) plot(dumm_model)
方案2:调整模型控制参数(仅测试用)
若必须保留缺失值,可降低显著性检验的阈值,让模型更容易生成分裂节点,但此方法可能导致过拟合,仅用于测试:
library(partykit) data("airquality") dumm_model <- ctree(Ozone ~ ., data = airquality, na.action = na.pass, control = ctree_control(teststat = "quadratic", testtype = "Bonferroni", mincriterion = 0.9)) # 默认mincriterion为0.95,降低阈值 plot(dumm_model)
内容的提问来源于stack exchange,提问作者Gourav Karmakar
相关产品推荐
相关产品推荐

