【问题标题】:Large standard error of prediction from parsnip vs base R欧洲防风草与基础 R 预测的大标准误差
【发布时间】:2020-09-24 06:00:07
【问题描述】:

似乎predict 产生了一个太大的标准错误。 parsnip 模型得到 0.820,而基本 R 模型得到 0.194。标准误差 0.194 似乎更合理,因为在我的预测上下大约 2*0.195 是置信区间的末端。我的问题/误解是什么?

library(parsnip)
library(dplyr)

# example data
mod_dat <- mtcars %>%
  as_tibble() %>%
  mutate(cyl_8 = as.numeric(cyl == 8)) %>%
  select(mpg, cyl_8)

parsnip_mod <- logistic_reg() %>%
  set_engine("glm") %>%
  fit(as.factor(cyl_8) ~ mpg, data = mod_dat)

base_mod <- glm(as.factor(cyl_8) ~ mpg, data = mod_dat, family = "binomial")

parsnip_pred <- tibble(mpg = 18) %>%
  bind_cols(predict(parsnip_mod, new_data = ., type = 'prob'),
            predict(parsnip_mod, new_data = ., type = 'conf_int', std_error = T)) %>%
  select(!ends_with("_0"))

base_pred <- predict(base_mod, tibble(mpg = 18), se.fit = T, type = "response") %>%
  unlist()

# these give the same prediction but different SE
parsnip_pred
#> # A tibble: 1 x 5
#>     mpg .pred_1 .pred_lower_1 .pred_upper_1 .std_error
#>   <dbl>   <dbl>         <dbl>         <dbl>      <dbl>
#> 1    18   0.614         0.230         0.895      0.820
base_pred
#>          fit.1       se.fit.1 residual.scale 
#>      0.6140551      0.1942435      1.0000000

reprex package (v0.3.0) 于 2020 年 6 月 4 日创建

--编辑--

正如@thelatemail 和@Limey 所说,使用type="link" 作为基本模型将给出logit 标度上的标准误差(0.820)。但是,我想要概率尺度上的标准误差。 parsnip documentation 中是否有我缺少的选项?我想使用parsnip

【问题讨论】:

  • 我认为保留 so 帖子对于这种特定情况也很好,他清楚地知道他在问什么,有一个代表,而且这个问题很有趣,交叉验证的人也将如何验证回答包装特定的问题?你可以尝试在parnsnip的github repo上提问
  • 您明确要求type = "response",这不是默认值。我可以使用predict(base_mod, data.frame(mpg=18), se.fit=TRUE, type="link") 获得0.82 结果 - 查看?predict.glm 以查看不同的types 返回。
  • @thelatemail 我想要响应/概率标度上的标准误差,这就是我使用type = "response" 的原因。如何从parsnip 模型中获得结果以给出相同比例的标准误差?查看修改
  • @LeviBaguley - 您可以通过predict(parsnip_mod, new_data =tibble(mpg=18), type="raw", opts=list(se.fit=TRUE, type="response")) 使用底层predict.glm 函数来强制输出您想要的输出,但与直接使用predict.glm 相比,这似乎过于复杂。

标签: r predict confidence-interval tidymodels


【解决方案1】:

@thelatemail 是正确的。来自 predict.glm 的在线文档:

类型
所需的预测类型。默认值在线性预测变量的范围内;另一种“响应”是在响应变量的范围内。因此,对于默认二项式模型,默认预测是对数赔率(logit 尺度上的概率),type = "response" 给出预测概率。

默认是使用 logit 标度报告,'response' 请求原始概率标度的结果。从parsnip::predictdocumentation 中,我发现它如何选择返回结果的尺度并不明显,但很明显它使用的是原始概率尺度。

所以这两种方法都返回正确的答案,它们只是使用不同的尺度。

我不想从@thelatemail 窃取已接受的解决方案,因此请邀请他们对此发布类似的答案。

【讨论】:

  • 一切都好 - 我发帖时没有时间写出正确的答案,所以投了赞成票。
  • 有道理!我想我现在的问题是如何让.std_error 与三个.pred_* 列的规模相同。我将编辑我的问题。
  • @Limey 在他们的分析中是正确的。不过,对于您的问题...要获得概率尺度上的标准误差,您必须使用 Delta method 之类的东西来进行计算。但是,当您接近零或一时,这将非常糟糕。我认为不可能以任何现实的精确度获得您想要的东西。您可以得到与贝叶斯模型非常相似的东西(使用“stan”引擎)。看看rstanarm::stan_glm()
【解决方案2】:

正如@thelatemail 所说,您可以使用parsnip 使用以下参数获得概率尺度上的标准误差:type="raw", opts=list(se.fit=TRUE, type="response")。但此时,您不妨使用基本模型,因为输出完全相同。但是,如果您已经在使用 parsnip 模型并且想要基本模型的标准错误输出,这仍然很有用。

library(parsnip)
library(dplyr)

mod_dat <- mtcars %>%
  as_tibble() %>%
  mutate(cyl_8 = as.numeric(cyl == 8)) %>%
  select(mpg, cyl_8)

parsnip_mod <- logistic_reg() %>%
  set_engine("glm") %>%
  fit(as.factor(cyl_8) ~ mpg, data = mod_dat)

base_mod <- glm(as.factor(cyl_8) ~ mpg, data = mod_dat, family = "binomial")

predict(parsnip_mod, tibble(mpg = 18), type="raw",
        opts=list(se.fit=TRUE, type="response")) %>% 
  as_tibble()
#> # A tibble: 1 x 3
#>     fit se.fit residual.scale
#>   <dbl>  <dbl>          <dbl>
#> 1 0.614  0.194              1

predict.glm(base_mod, tibble(mpg = 18), se.fit = T, type="response") %>% 
  as_tibble()
#> # A tibble: 1 x 3
#>     fit se.fit residual.scale
#>   <dbl>  <dbl>          <dbl>
#> 1 0.614  0.194              1

reprex package (v0.3.0) 于 2020-06-11 创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多