ggplot2中stat_smooth报错:x唯一值不足支持10个knots,如何调整k?
解决ggplot2中stat_smooth()的k值报错问题
问题场景
你运行了以下适配后的代码:
t3 %>% gather(-Border, key = "var", value = "value") %>% ggplot(aes(x = value, y = Border)) + geom_point() + stat_smooth() + facet_wrap(~ var, scales = "free") + theme_bw()
出现报错:Computation failed in stat_smooth(): x has insufficient unique values to support 10 knots: reduce k。你的数据中仅一个变量有20个唯一值,其余变量唯一值在5-6之间,总样本量1000,需要保留平滑线。
解决方案
1. 如何降低k值
直接在stat_smooth()中通过指定模型公式设置k值即可。推荐用广义可加模型(GAM),通过formula = y ~ s(x, k = 5)明确限定k值,修改后的代码如下:
t3 %>% gather(-Border, key = "var", value = "value") %>% ggplot(aes(x = value, y = Border)) + geom_point() + stat_smooth(method = "gam", formula = y ~ s(x, k = 5)) + facet_wrap(~ var, scales = "free") + theme_bw()
如果偏好loess方法,也可以通过调整span参数控制平滑程度(span值越小拟合越贴近数据,越大则越平滑),示例:
stat_smooth(method = "loess", span = 0.75)
但针对你的数据情况,用GAM指定k值的方式更直接解决报错问题。
2. k=5是否合理
对于唯一值在5-6之间的变量,k=5完全合理:
- 样条拟合的k值(节点数)不能超过x变量的唯一值数量,否则会因自由度不足报错
- k=5匹配了你大部分变量的唯一值规模,既能生成合适的平滑趋势线,也不会出现过度拟合或无法计算的问题
内容的提问来源于stack exchange,提问作者user2502904
相关产品推荐
相关产品推荐

