从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似乎是与glm的fitted.values类似的值。据我所知,它不应该在因变量范围之外得到合适的值,但很明显,这就是正在发生的事情。
发布于 2021-11-24 15:29:32
“线性预测器”与“拟合值”不一样,除非GLM装有标识链接。通常,线性预测器是eta = b0 + b1*x1 + b2*x2 + ...,而拟合值是mu = linkinv(eta),其中linkinv是逆链接函数(例如,logistic或逆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)) ## TRUEhttps://stackoverflow.com/questions/70098526
复制相似问题