speedglm() 的拟合值看起来与 glm() 的拟合值非常不同

fitted values from speedglm() look very different from fitted values with glm()

speedglm() 返回的拟合值看起来与从 glm() 返回的完全不同,我不知道为什么。例如,如果我 运行 这个:

data("lalonde")
glm <- glm(married ~ treat + age + educ + black + hisp + nodegr, data = lalonde, family = "binomial")
fitted_vals <- glm$fitted.values

我大致得到了我所期望的,这是 0 和 1 之间的每次观察的拟合值(married 的两个可能值)。例如

skimr::skim(fitted_vals)

── Data Summary ────────────────────────
                           Values     
Name                       fitted_vals
Number of rows             445        
Number of columns          1          
_______________________               
Column type frequency:                
  numeric                  1          
________________________              
Group variables            None       

── Variable type: numeric ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable n_missing complete_rate  mean     sd     p0   p25   p50   p75  p100 hist 
1 data                  0             1 0.169 0.0913 0.0378 0.105 0.147 0.205 0.627 ▇▅▁▁▁

但是,如果我 运行 使用 speedglm() 相同的模型,我会得到截然不同的结果:

speedglm <- speedglm(married ~ treat + age + educ + black + hisp + nodegr, data = lalonde, family = binomial(), fitted = TRUE)
fitted_vals <- speedglm$linear.predictors

skimr::skim(fitted_vals)

── Data Summary ────────────────────────
                           Values     
Name                       fitted_vals
Number of rows             445        
Number of columns          1          
_______________________               
Column type frequency:                
  numeric                  1          
________________________              
Group variables            None       

── Variable type: numeric ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  skim_variable n_missing complete_rate  mean    sd    p0   p25   p50   p75  p100 hist 
1 data                  0             1 -1.71 0.606 -3.24 -2.14 -1.76 -1.35 0.521 ▂▇▇▂▁

有人知道这里发生了什么吗?根据文档,linear.predictors 似乎是 glmfitted.values 的类似值。据我所知,它不应该获得因变量范围之外的拟合值,但显然这就是正在发生的事情

“线性预测变量”与“拟合值”不同,除非 GLM 装有身份 link。一般来说, 线性预测器 eta = b0 + b1*x1 + b2*x2 + ...,而拟合值是 mu = linkinv(eta),其中 linkinv 是反 link 函数(例如在这种情况下是 logistic 或 inverse-logit)。

一般来说,使用访问器方法总是更安全:这样你就不必担心内部定义

## fitted values (data scale)
all.equal(fitted(glm), fitted(speedglm))  ## TRUE
## predicted values (linear-predictor scale)
all.equal(predict(glm), predict(speedglm))  ## TRUE
## predict(., type = "response") == fitted(.)
all.equal(predict(glm, type = "response"), fitted(speedglm)) ## TRUE