【问题标题】:How to predict x values from a linear model (lm)如何从线性模型 (lm) 预测 x 值
【发布时间】:2012-08-18 01:27:22
【问题描述】:

我有这个数据集:

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 值,我想知道x 的预测值,例如ynew &lt;- c(5.5, 4.5, 3.5),但如果我使用 predict() 函数,它只会计算新的 y 值。

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

【问题讨论】:

    标签: r lm predict


    【解决方案1】:

    如果您的关系是非单调的,或者如果您有多个预测变量值,那么给定 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)
    

    【讨论】:

      【解决方案2】:

      由于这是化学中的一个典型问题(从校准中预测值),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的绝对值应该仍然是正确的。

      【讨论】:

      • 对于它的价值,library(sos); findFn("{inverse prediction}") 找到了这个函数,以及 quantchem 包中的一个类似函数(它似乎也做非线性反演......)
      【解决方案3】:

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

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

      【讨论】:

      • 我知道我可以用代数解决这个问题,但我认为这可以用一些 R 函数来解决。我会用非线性回归来实现吗?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2020-12-06
      • 2018-05-18
      • 1970-01-01
      • 2019-01-22
      • 2018-09-14
      相关资源
      最近更新 更多