tidyverse/dplyr环境中gamlss报object '.' not found错,lm/gam/glm正常
嘿,我遇到过类似的gamlss和dplyr配合的坑!来给你捋捋问题出在哪以及怎么解决~
问题根源
你遇到的object '.' not found错误,本质是gamlss的公式解析机制和lm/glm/gam不一样:后三者在调用时会自动继承当前的调用环境(也就是dplyr/map迭代里的.临时数据对象),但gamlss对数据来源的要求更严格,不会自动识别.,必须你明确指定数据参数。
具体解决方法
这里有几种靠谱的解决思路,按推荐程度排序:
1. 显式指定data = .(最直接)
在gamlss调用里加上data = .,明确告诉它用当前迭代的分组数据:
library(tidyverse) library(gamlss) # 先构造你的嵌套分组数据(示例用mtcars) mtcars %>% group_by(cyl) %>% nest() %>% # 关键是在gamlss里加上data = . mutate(model = map(data, ~gamlss(mpg ~ wt, data = ., family = NO)))
2. 改用完整匿名函数替代公式简写
如果公式简写的环境继承还是有问题,换成更明确的匿名函数写法,直接把数据参数传递给gamlss:
mtcars %>% group_by(cyl) %>% nest() %>% mutate(model = map(data, function(dat) { gamlss(mpg ~ wt, data = dat, family = NO) }))
这种写法完全避开了公式简写的环境歧义,稳定性更高。
3. 排查变量与环境冲突
偶尔也可能是全局环境里有重名变量干扰,导致gamlss没找到分组数据里的变量。这时候可以检查公式里的变量是否都在嵌套的data对象中,或者暂时清空全局环境的同名变量测试。
为什么lm/glm/gam能正常运行?
lm系列(包括gam)的公式解析器会自动在调用环境中查找数据,当你用~lm(mpg~wt)时,它会默认从.这个临时环境里取数据;但gamlss的设计逻辑更偏向于必须显式声明数据源,所以不写data = .的话,它就找不到.对象了。
内容的提问来源于stack exchange,提问作者Hedgehog
相关产品推荐
相关产品推荐

