2014-09-06 55 views
1

我已经获得了由非r用户设置的logit模型的一些系数。我想将这些系数导入r,并在相同的数据集(ROC和混淆矩阵)和我自己的模型上生成一些拟合估计的好处。我首先想到的是使用的东西给系数强制到现有GLM的物体,像预测()与r中的任意系数

summary(fit)$coefficients[,1] <- y

summary(fit)$coefficients <- x

,其中Y和X包含我试图用它来预测系数和配合矩阵是以前创建的适合数据集的虚拟glm对象。当然,这只给我一些错误。

是否有任何方法将任意系数向量传递给predict()函数或指定模型中的系数?我可以通过传递一个向量到GLM中的偏移参数来强制执行此操作吗?谢谢

编辑:正如在评论中提到的,使用任意系数没有太多的统计基础。我有一个商业合作伙伴认为他/她“知道”了正确的系数,我正试图根据这些估计值与正确模型生成的系数来量化预测能力的损失。

Edit2:根据BondedDust的回答,我能够强制系数,但无法清除由于强制而返回的预测()返回的错误消息,它会显示predict.lm,它被调用预测,还会查看系数的等级并导致错误。

+0

回应[这个问题](http://stackoverflow.com/questions/24112860/manually-build-logistic-regression-model-for-prediction-in-r/24113738#24113738)我做了一个[makeglm ()](https://gist.github.com/MrFlick/ae299d8f3760f02de6bf)的功能,听起来像在这种情况下会很有用。如果您可能提供了更具体的样本,我们可能会尝试一下。 – MrFlick 2014-09-06 00:17:06

+1

@Stencill 您可以通过将数据中的相关变量乘以给定的系数手动计算预测值吗?例如'coefVector%*%t(cbind(1,dataVariables))'。 (其中coefVector是所提供的系数矢量,datavariables是您的相关系数数据) – user20650 2014-09-06 04:47:41

+0

@BondedDust对不起,周末远离电脑 - 我会继续及时更新从现在开始。 – Stencil 2014-09-08 17:12:07

回答

3

如果您按照通过predict.glm的代码将代码传递给predict.lm,那么看起来需要更改的模型列表的节点确实是fit$coefficients。但是,更改summary()对象将不起作用。 glm和lm对象中的[['coefficients']]不是具有列的矩阵:'估计','标准。错误','t值','Pr(> | t |)',如由summary产生的,而只是一个系数向量。

fit$coefficients <- y 
newpred <- predict(fit) 

如果您需要进一步使用fit,您可以复制并使用它。

+0

这工作。非常感谢。这有点破解,因为glm对象的其余部分(Pvalues等)现在不匹配,但我能够成功通过predict()。 – Stencil 2014-09-08 17:10:32

+0

划痕,似乎我正在通过适合不正确的预测。 > pred < - predict(fit,newdata = sample1) 其中fit是包含修改系数的glm对象,返回以下错误: > [[.data.frame](beta,piv)中的错误:未定义列选择 :警告信息: 在predict.lm(object,newdata,se.fit,scale = 1,type = ifelse(type ==: )中,从缺乏等级的拟合中预测可能会产生误导 – Stencil 2014-09-08 17:41:15

+0

这绝对是一种破解,你肯定是要求的,你使用的方法没有真正的统计基础,我不知道你在哪里解决这个问题,你应该先A)发布一个数据例子,并且B)更新你的问题编辑过程而不是发表评论给我的答案。 – 2014-09-08 17:57:16

5

这不是您发布的问题的答案 - 哪个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将生成计算所需的虚拟变量 - 检查排序与系数向量的顺序相同。

+0

谢谢,我能够得到这个工作。 – Stencil 2014-09-09 21:21:57

+0

如果我想根据probit模型(即'glm'命令中的'family = binomial(link =“probit”)')进行预测,我将如何更改上述(即'plogis(p2)')? – rp1 2017-09-15 23:41:21

+1

@ rp1;我不确定 - probit链接的公式是什么? (作为'plogis' =='1 /(1 + e(-xb))')。我*想*您将使用'pnorm'函数('pnorm(p2)'),但最好在https://stats.stackexchange.com/questions – user20650 2017-09-15 23:54:22

1

或者,你可以使用这样的事情:

fit <- lm(Y ~ A + B + C, data=fakedata)

fit$coefficients <- c(1, 2, 3) # this would change the coefficients for A, B, C to 1, 2 and 3, respectively.

Y_hat_new <- 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路线。