2

似乎predict产生了一个太大的标准错误。我用模型得到 0.820,parsnip但用基本 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 包(v0.3.0)于 2020-06-04 创建

--编辑--

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

4

2 回答 2

1

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

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

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

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

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

于 2020-06-05T07:25:40.307 回答
0

正如@thelatemail 所说,您可以使用参数获得概率尺度上的标准误差parsniptype="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 包(v0.3.0)于 2020 年 6 月 11 日创建

于 2020-06-12T02:26:03.090 回答