如何从线性模型(lm)中预测x值

10

我有这样的数据集:

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)
我想知道如果我有新的y值,例如ynew < - c(5.5, 4.5, 3.5),那么x的预测值是多少,但如果我使用predict()函数,它只计算新的y值。如何预测新的x值如果我有新的y值?
3个回答

5

我认为你只需要使用代数将y=a+b*x反转为x=(y-a)/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)

看着你这里的“数据”,我认为非线性回归可能更好...

输入图片说明


1
我知道可以用代数方法解决这个问题,但我想用一些 R 函数来解决。你能用非线性回归来解决吗?谢谢。 - alexmulo

4

由于这是化学中的典型问题(从校准中预测值),因此chemCal软件包提供了inverse.predict功能。但是,此功能仅适用于“具有模型公式y〜x或y〜x-1的单变量模型对象类lm或rlm。”

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")

警告:如果您需要逆向预测大量值,则此函数速度较慢且不适合使用。

如果我没记错的话,负SE的出现是因为该函数期望斜率始终为正。 SE的绝对值仍然是正确的。


1
就此而言,library(sos); findFn("{inverse prediction}") 可以找到这个函数,以及 quantchem 包中的一个类似函数(该函数似乎也可以进行非线性反演...) - Ben Bolker

2

如果你的关系是非单调的,或者你有多个预测值,那么对于给定的y值可能会有多个x值,你需要决定如何处理。

一种慢速的方法(也许是其他提到的包中使用的方法)是使用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)

您可以使用TeachingDemos软件包中的TkPredict函数来估算一个解决方案。
或者,您可以通过生成大量预测点,并将它们提供给approxfunsplinfun函数来快速得到近似值。
tmpx <- seq(min(x), max(x), length.out=250)
tmpy <- predict(fit, data.frame(x=tmpx) )
tmpfun <- splinefun( tmpy, tmpx )
tmpfun(4)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接