2010-11-16 29 views
9

使用predict()可以针对给定模型获得自变量(x)的某个值的因变量(y)的预测值。对于给定的y,是否有预测x的函数?“预测”函数的反函数

例如:

kalythos <- data.frame(x = c(20,35,45,55,70), 
    n = rep(50,5), y = c(6,17,26,37,44)) 
kalythos$Ymat <- cbind(kalythos$y, kalythos$n - kalythos$y) 
model <- glm(Ymat ~ x, family = binomial, data = kalythos) 

如果我们想知道该模型的预测值x=50

predict(model, data.frame(x=50), type = "response") 

我想知道哪些x使得y=30,例如。

+4

预测总是在一些统计模型的上下文中。在变量可以被“预测”之前,需要一个分布和结构假设。在函数为lm和glm的情况下,假定自变量是固定的(即确定性的),所以这些预测是没有意义的。如果你想对X进行推理,那么你将不得不使用某种分层方法来使X随机。最有可能的是,你最终会得到一个贝叶斯框架,它会给你X的后缀,然后你可以用它来进行预测。 – VitoshKa 2010-11-16 09:26:47

+2

你最好指定你想要的。用1 x,这是可行的。有了2个,你有无限的可能答案。所以我真的很想知道为什么你需要逆向预测。是否用于校准目的? - 编辑:另见VitoshKa的评论。 – 2010-11-16 09:27:30

+0

你可以建立一个逆模型,比如'invM1 < - lm(x〜y,data)',然后在新的预测变量'y'上使用'predict'。现在,在你加入之前,我建议考虑上面评论的@vitoshKa。 – PavoDive 2016-06-06 16:43:02

回答

8

看到以前的答案被删除。在你的情况,考虑到N = 50,模型是二项式,你使用会计算x时Y:

f <- function (y,m) { 
    (logit(y/50) - coef(m)[["(Intercept)"]])/coef(m)[["x"]] 
} 
> f(30,model) 
[1] 48.59833 

但这样做的时候,你最好咨询统计员向您展示如何计算逆预测区间。请考虑VitoshKa的考虑因素。

1

你只需要重新回归方程,但由于上述状态的评论,这可能证明是棘手的,不一定有一个有意义的解释。

但是,对于情况下,你提出你可以使用:

(1/coef(model)[2])*(model$family$linkfun(30/50)-coef(model)[1]) 

注意,我做了除以x系数首次允许的name属性是正确的。

0

对于只是一个快速视图(不间隔,并考虑其他问题),你可以在TeachingDemos包使用TkPredict功能。它不是直接做这件事,而是允许你动态地改变x值,看看预计的y值是什么,所以移动x直到找到所需的Y是相当简单的(对于给定的额外值x's),这也将显示可能存在多个x的问题,这些问题对于相同的y会起作用。

0

chemcal包有一个inverse.predict()功能,适用于形式y ~ xy ~ x - 1

1

碰到这个旧线程,但想到我会添加其他一些信息的配合。包装MASS的功能dose.p用于logit/probit型号。 SE是通过delta方法。

> dose.p(model,p=.6) 
      Dose  SE 
p = 0.6: 48.59833 1.944772 

拟合逆模型(X〜Y)不会是有道理的,因为在这里,作为@VitoshKa说,我们假设X是固定的和y(0/1响应)是随机的。此外,如果数据未分组,则只有解释变量的两个值:0和1.但即使我们假设x是固定的,计算给定p的剂量x的置信区间仍然是有意义的,与@VitoshKa所说的相反。就像我们可以根据ED50重新设定模型的参数一样,我们可以为ED60或其他分位数做这样的操作。参数是固定的,但我们仍然为它们计算CI。