上下文:tidyversedplyr环境/工作流程。

对于在解决回归结果时遇到的以下问题,我深表感谢。

这个最小的可复制性说明了问题

mtcars %>%
  gamlss(mpg ~ hp + wt + disp, data = .) %>%
  model.frame()


下面的示例说明了更广泛的上下文,并按预期工作(生成所示图像)。如果我所做的只是将~lm(...)更改为~glm(...)~gam(...),它也可以工作:

library(tidyverse)
library(broom)
library(gamlss)

library(datasets)

mtcars %>%
  nest(-am) %>%
  mutate(am = factor(am, levels = c(0, 1), labels = c("automatic", "manual")),
         fit = map(data, ~lm(mpg ~ hp + wt + disp, data = .)),
         results = map(fit, augment)) %>%
  unnest(results) %>%
  ggplot(aes(x = mpg, y = .fitted)) +
    geom_abline(intercept = 0, slope = 1, alpha = .2) +  # Line of perfect fit
    geom_point() +
    facet_grid(am ~ .) +
    labs(x = "Miles Per Gallon", y = "Predicted Value") +
    theme_bw()


r - dplyr:评估错误:对象'。在gamlss中找不到,但在lm,gam,glm方法中都很好-LMLPHP

但是,如果我尝试如下使用~gamlss(...)

mtcars %>%
  nest(-am) %>%
  mutate(am = factor(am, levels = c(0, 1), labels = c("automatic", "manual")),
         fit = map(data, ~gamlss(mpg ~ hp + wt + disp, data = .)),
         results = map(fit, augment)) %>%
  unnest(results) %>%
  ggplot(aes(x = mpg, y = .fitted)) +
    geom_abline(intercept = 0, slope = 1, alpha = .2) +  # Line of perfect fit
    geom_point() +
    facet_grid(am ~ .) +
    labs(x = "Miles Per Gallon", y = "Predicted Value") +
    theme_bw()


我观察到以下错误:

GAMLSS-RS iteration 1: Global Deviance = 58.7658
GAMLSS-RS iteration 2: Global Deviance = 58.7658
GAMLSS-RS iteration 1: Global Deviance = 76.2281
GAMLSS-RS iteration 2: Global Deviance = 76.2281
******************************************************************
Family:  c("NO", "Normal")

Call:  gamlss(formula = mpg ~ hp + wt + disp, data = .)

Fitting method: RS()

------------------------------------------------------------------
Mu link function:  identity
Mu Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept) 43.811721   3.387118  12.935 4.05e-07 ***
hp           0.001768   0.021357   0.083  0.93584
wt          -6.982534   1.998827  -3.493  0.00679 **
disp        -0.019569   0.021460  -0.912  0.38559
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
Sigma link function:  log
Sigma Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   0.8413     0.1961    4.29  0.00105 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

------------------------------------------------------------------
No. of observations in the fit:  13
Degrees of Freedom for the fit:  5
      Residual Deg. of Freedom:  8
                      at cycle:  2

Global Deviance:     58.76579
            AIC:     68.76579
            SBC:     71.59054
******************************************************************
Error in mutate_impl(.data, dots) :
  Evaluation error: object '.' not found.
In addition: Warning messages:
1: Deprecated: please use `purrr::possibly()` instead
2: Deprecated: please use `purrr::possibly()` instead
3: Deprecated: please use `purrr::possibly()` instead
4: Deprecated: please use `purrr::possibly()` instead
5: Deprecated: please use `purrr::possibly()` instead
6: In summary.gamlss(model) :
  summary: vcov has failed, option qr is used instead

15: stop(list(message = "Evaluation error: object '.' not found.",
        call = mutate_impl(.data, dots), cppstack = NULL))
14: .Call(`_dplyr_mutate_impl`, df, dots)
13: mutate_impl(.data, dots)
12: mutate.tbl_df(tbl_df(.data), ...)
11: mutate(tbl_df(.data), ...)
10: as.data.frame(mutate(tbl_df(.data), ...))
9: mutate.data.frame(., am = factor(am, levels = c(0, 1), labels = c("automatic",
       "manual")), fit = map(data, ~gamlss(mpg ~ hp + wt + disp,
       data = .)), results = map(fit, augment))
8: mutate(., am = factor(am, levels = c(0, 1), labels = c("automatic",
       "manual")), fit = map(data, ~gamlss(mpg ~ hp + wt + disp,
       data = .)), results = map(fit, augment))
7: function_list[[i]](value)
6: freduce(value, `_function_list`)
5: `_fseq`(`_lhs`)
4: eval(quote(`_fseq`(`_lhs`)), env, env)
3: eval(quote(`_fseq`(`_lhs`)), env, env)
2: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
1: mtcars %>% nest(-am) %>% mutate(am = factor(am, levels = c(0,
       1), labels = c("automatic", "manual")), fit = map(data, ~gamlss(mpg ~
       hp + wt + disp, data = .)), results = map(fit, augment)) %>%
       unnest(results) %>% ggplot(aes(x = mpg, y = .fitted))


是否有人建议要使此示例按预期工作需要进行哪些更改?

如果您对问题出在哪里有任何见解,我将不胜感激。为什么它不起作用。如何诊断此类问题。

最佳答案

model.frame.gamlss没有正确考虑data参数的原始环境。

在下面的代码中查看我的评论:

model.frame.gamlss <- function(formula, what = c("mu", "sigma", "nu", "tau"), parameter = NULL, ...)
{
    object <- formula
    dots <- list(...)
    what <- if (!is.null(parameter)) {
        match.arg(parameter, choices = c("mu", "sigma", "nu", "tau"))
    } else match.arg(what)
    Call <- object$call
    parform <- formula(object, what)
    data <- if (!is.null(Call$data)) {
        # problem here, as Call$data is .
        eval(Call$data)
        # instead, this would work:
        # eval(Call$data, environment(formula$mu.terms))
        # (there is no formula$terms, just mu.terms and sigma.terms)
    } else {
        environment(formula$terms)
    }
    Terms <- terms(parform)
    mf <- model.frame(
        Terms,
        data,
        xlev = object[[paste(what, "xlevels", sep = ".")]]
    )
    mf
}


我猜应该与gamlss维护者一起提出问题,除非已经完成。

07-26 06:08