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
似乎是 glm
的 fitted.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
从 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
的类似值。据我所知,它不应该获得因变量范围之外的拟合值,但显然这就是正在发生的事情
“线性预测变量”与“拟合值”不同,除非 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