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)

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

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

4

3 回答 3

4

我认为你只需要使用代数来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)

在这里查看您的“数据”,我认为非线性回归可能会更好...

在此处输入图像描述

于 2012-08-22T15:35:59.870 回答
4

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

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

警告:这个函数很慢而且不适合,如果你需要反演。预测大量的值。

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

于 2012-08-22T15:58:44.967 回答
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)

您可以使用包中的TkPredict功能TeachingDemos来观察解决方案。

或者,您可以通过生成大量预测点来获得相当快速的近似值,然后将它们提供给approxfunorsplinfun函数以产生近似值:

tmpx <- seq(min(x), max(x), length.out=250)
tmpy <- predict(fit, data.frame(x=tmpx) )
tmpfun <- splinefun( tmpy, tmpx )
tmpfun(4)
于 2012-08-22T19:40:16.517 回答