逐步回归每一步的系数

问题描述 投票:0回答:3

我在 R 中使用逐步回归,代码如下:

model_scicareer_all <- glm(scicareer ~ .,
                           family = binomial(link = "logit"), data = clean_data)
summary(model_scicareer_all)

intercept_only <- glm(scicareer ~ -1,
                      family = binomial(link = "logit"), data = clean_data)

forward <- step(intercept_only, direction='forward', scope=formula(model_scicareer_all), trace=1000)

代码运行没有问题。但是,我想获得每一步的系数。那可能吗? (我知道 SPSS 就是这样做的。)

我尝试了不同的输入,但无法打印每一步的系数

r glm
3个回答
2
投票

step 有

keep
参数。用它来获取每个模型运行的系数:

示例:

final <- step(lm(mpg~1,mtcars), DF2formula(mtcars),keep = \(x,y)list(coef(x)), trace = FALSE)
c(final$keep)
[[1]]
(Intercept) 
   20.09062 

[[2]]
(Intercept)          wt 
  37.285126   -5.344472 

[[3]]
(Intercept)          wt         cyl 
  39.686261   -3.190972   -1.507795 

[[4]]
(Intercept)          wt         cyl          hp 
 38.7517874  -3.1669731  -0.9416168  -0.0180381 

请注意,您可以保留任何东西。包括模型本身:

final <- step(lm(mpg~1,mtcars), DF2formula(mtcars),keep = \(x)list(x), trace = FALSE)

[[1]]

Call:
lm(formula = mpg ~ 1, data = mtcars)

Coefficients:
(Intercept)  
      20.09  


[[2]]

Call:
lm(formula = mpg ~ wt, data = mtcars)

Coefficients:
(Intercept)           wt  
     37.285       -5.344  


[[3]]

Call:
lm(formula = mpg ~ wt + cyl, data = mtcars)

Coefficients:
(Intercept)           wt          cyl  
     39.686       -3.191       -1.508  


[[4]]

Call:
lm(formula = mpg ~ wt + cyl + hp, data = mtcars)

Coefficients:
(Intercept)           wt          cyl           hp  
   38.75179     -3.16697     -0.94162     -0.01804  

0
投票

step
有一个
trace
参数,但似乎它不返回系数。请改用如图所示的
trace
函数。

trace(glm, exit = quote(print(coef(returnValue()))))
fm <- glm(mpg ~., data = mtcars)
step(fm)
untrace(flm)

0
投票

您可以通过捕获输出、提取公式并为每个公式重新运行模型来以一种黑客的方式获得系数。仅当您想要将表中的系数与未包含在特定模型中的系数的

dplyr::bind_rows()
值组合起来时,才需要下面的最后一步 (
NA
)(这当然也可以在基 R 中完成,但不能像紧凑)。

fm <- lm(mpg ~ ., data = mtcars)
cc <- capture.output(step(fm))
## get all lines with a tilde but *without* a comma (the finally selected
##  model includes the formula, we don't want that line)
forms <- grep("~", cc, value = TRUE) |> 
         grep(pattern = ",", invert = TRUE, value = TRUE)
## refit the model, get coefficients
coefs <- lapply(forms, \(f) coef(update(fm, formula = f)))
dplyr::bind_rows(coefs)
# A tibble: 8 × 11
  `(Intercept)`    cyl    disp      hp   drat    wt  qsec     vs    am   gear
          <dbl>  <dbl>   <dbl>   <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl>
1         12.3  -0.111  0.0133 -0.0215  0.787 -3.72 0.821  0.318  2.52  0.655
2         11.0  NA      0.0128 -0.0219  0.835 -3.69 0.842  0.390  2.58  0.712
3          9.77 NA      0.0121 -0.0210  0.875 -3.71 0.911 NA      2.52  0.760
4          9.20 NA      0.0155 -0.0247  0.810 -4.13 1.01  NA      2.59  0.606
5         10.7  NA      0.0131 -0.0218  1.02  -4.04 0.991 NA      2.98 NA    
6         14.4  NA      0.0112 -0.0212 NA     -4.08 1.01  NA      3.47 NA    
7         17.4  NA     NA      -0.0176 NA     -3.24 0.811 NA      2.93 NA    
8          9.62 NA     NA      NA      NA     -3.92 1.23  NA      2.94 NA    
[...]
© www.soinside.com 2019 - 2024. All rights reserved.