我有一些由非 r 用户设置的 logit 模型系数。我想将这些系数导入到 r 中,并在同一数据集(ROC 和混淆矩阵)与我自己的模型上生成一些拟合优度估计。我的第一个想法是使用类似的东西将系数强制到现有的 GLM 对象中
总结(拟合)$系数[,1] <- y
或
总结(拟合)$系数<- x
其中 y 和 x 是包含我试图用来预测和拟合的系数的矩阵,是之前创建的适合数据集的虚拟 glm 对象。当然,这只会给我带来错误。
有没有办法将任意系数向量传递给predict()函数或在模型中指定系数?我可以通过将向量传递到 GLM 中的 offset 参数来强制执行此操作吗?谢谢
编辑:正如评论中提到的,使用任意系数没有太多的统计基础。我有一个业务合作伙伴相信他/她“知道”正确的系数,并且我正在尝试根据这些估计与正确模型生成的系数来量化预测能力的损失。
Edit2:根据 BondedDust 的回答,我能够强制系数,但是无法清除 Predict() 由于强制而返回的错误消息,看起来由 Predict 调用的 Predict.lm 也查看系数的排名,这会导致错误。
如果您按照将对象传递给
predict.glm
的代码执行predict.lm
,则看起来需要更改的模型列表的节点确实是fit$coefficients
。但是,更改 summary()
对象不会产生任何效果。 glm 和 lm 对象中的 [['coefficients']]
不是具有以下列的矩阵: 'Estimate', 'Std. Error'、't value'、'Pr(>|t|)' 例如由 summary
产生,而只是系数向量。
fit$coefficients <- y
newpred <- predict(fit)
如果您需要进一步使用
fit
,您可以制作一份副本并进行处理。
这不是您发布的问题的答案 - BondedDust 回答了 - 但描述了您自己计算预测概率的另一种方法,这在这种情况下可能会有所帮助。
# Use the mtcars dataset for a minimum worked example
data(mtcars)
# Run a logistic regression and get predictions
mod <- glm(vs ~ mpg + factor(gear) + factor(am), mtcars, family="binomial")
p1 <- predict(mod, type="response")
# Calculate predicted probabilities manually
m <- model.matrix(~ mpg + factor(gear) + factor(am), mtcars)[,]
p2 <- coef(mod) %*% t(m)
p2 <- plogis(p2)
all(p1 == p2)
#identical(as.numeric(p1), as.numeric(p2))
您可以将
coef(mod)
替换为给您的系数向量。 model.matrix
将生成计算所需的虚拟变量 - 检查顺序是否与系数向量的顺序相同。
或者,你可以使用这样的东西:
适合<- lm(Y ~ A + B + C, data=fakedata)
拟合$系数<- c(1, 2, 3) # this would change the coefficients for A, B, C to 1, 2 and 3, respectively.
Y_帽子_新<- predict(fit, new_fakedata) # this Y_hat_new will be calculated as your new predicted outcome given the new coefficients and/or new_fakedata.
如果您遵循 model.matrix 路线,结果应该是相同的。
我一直在寻求做类似的事情,这个方法对我有用。
coefficients <- predict(model, data=model$data, type="terms")
coefficients <- as.data.frame(coefficients) %>% rename_with(~paste0(., "_coef"))
data <- cbind(model$data, coefficients)