如何预测从一个线性模型的x值(LM)(How to predict x values from a

2019-07-31 02:48发布

我有这组数据:

x <- c(0, 40, 80, 120, 160, 200)
y <- c(6.52, 5.10, 4.43, 3.99, 3.75, 3.60)

余计算使用线性模型lm()

model <- lm(y ~ x)

我想知道的预测值x ,如果我有新的y值,例如ynew <- c(5.5, 4.5, 3.5)但如果我使用predict()函数,它仅计算新的y值。

如何预测新的x值,如果我有新的y值?

Answer 1:

由于这是在化学的一个典型问题(预测从校准值),封装chemCal提供inverse.predict 。 然而,这种功能限于“类流明或RLM与模型公式y的单变量模型对象[秒]〜x或y〜X - 1”。

x <- c(0, 40, 80, 120, 160, 200)
y <- c(6.52, 5.10, 4.43, 3.99, 3.75, 3.60)
plot(x,y)
model <- lm(y ~ x)
abline(model)
require(chemCal)
ynew <- c(5.5, 4.5, 3.5)
xpred<-t(sapply(ynew,function(y) inverse.predict(model,y)[1:2]))
#  Prediction Standard Error
#[1,] 31.43007   -38.97289     
#[2,] 104.7669   -36.45131     
#[3,] 178.1037   -39.69539
points(xpred[,1],ynew,col="red")

警告:此功能是相当缓慢的,不适合,如果你需要inverse.predict大量的值。

如果我没有记错,该负。 社企发生,因为函数需要的斜率是始终为正。 SE的绝对值仍然应该是正确的。



Answer 2:

我想你只需要使用代数反转y=a+b*x ,以x=(ya)/b

cc <- coef(model)
(xnew <- (ynew-cc[1])/cc[2])
# [1]  31.43007 104.76689 178.10372

plot(x,y
abline(model)
points(xnew,ynew,col=2)

看你的“数据”在这里,我想了非线性回归可能会更好...



Answer 3:

如果你们的关系非单调或者如果你有多个预测值,则可以有多个x值对于给定的y值,你需要决定如何处理这一点。

这可能是缓慢的(并且可以是所提到的其他包中使用的方法)的一个选择是使用uniroot功能:

x <- runif(100, min=-1,max=2)
y <- exp(x) + rnorm(100,0,0.2)

fit <- lm( y ~ poly(x,3), x=TRUE )
(tmp <- uniroot( function(x) predict(fit, data.frame(x=x)) - 4, c(-1, 2) )$root)
library(TeachingDemos)
plot(x,y)
Predict.Plot(fit, 'x', data=data.frame(x=x), add=TRUE, ref.val=tmp)

您可以使用TkPredict功能从TeachingDemos包眼球的解决方案。

或者你可以通过产生大量的预测点,然后将它们喂到得到相当快逼近approxfunsplinfun功能产生近似:

tmpx <- seq(min(x), max(x), length.out=250)
tmpy <- predict(fit, data.frame(x=tmpx) )
tmpfun <- splinefun( tmpy, tmpx )
tmpfun(4)


文章来源: How to predict x values from a linear model (lm)
标签: r lm predict