R predict()函数返回错误/太多值

时间:2014-09-30 21:15:11

标签: r predict

我试图将吸光度(Abs)值转换为浓度(ng / mL),基于已建立的线性模型&标准曲线。我计划通过使用predict()函数来完成此操作。我无法获得predict()以返回所需的结果。以下是我的代码示例:

Standards<-data.frame(ng_mL=c(0,0.4,1,4),
                      Abs550nm=c(1.7535,1.5896,1.4285,0.9362))
LM.2<-lm(log(Standards[['Abs550nm']])~Standards[['ng_mL']])
Abs<-c(1.7812,1.7309,1.3537,1.6757,1.7409,1.7875,1.7533,1.8169,1.753,1.6721,1.7036,1.6707,
       0.3903,0.3362,0.2886,0.281,0.3596,0.4122,0.218,0.2331,1.3292,1.2734)


predict(object=LM.2,
        newdata=data.frame(Concentration=Abs[1]))#using Abs[1] as an example, but I eventually want predictions for all values in Abs

运行最后一行给出了这个输出:

> predict(object=LM.2,
+         newdata=data.frame(Concentration=Abs[1]))
         1          2          3          4 
 0.5338437  0.4731341  0.3820697 -0.0732525 
Warning message:
'newdata' had 1 row but variables found have 4 rows 

这似乎不是我想要的输出。我试图获得每个Absorbance(Abs)条目的单个预测浓度值。能够一次预测所有条目并将它们添加到现有数据框中会很好,但我甚至无法正确地给它一个值。我在这里阅读了很多主题,谷歌上的网页以及所有帮助文件,对于我的生活,我无法理解这个功能发生了什么。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:10)

必须newdata中有一个与最初用于拟合模型的模型公式中使用的变量相同的变量。

您有两个错误:

  1. 您不会在newdata中使用与用于拟合模型的协变量同名的变量,
  2. 由于您滥用公式界面,因此您难以解决问题。
  3. 不适合你的模特:

    mod <- lm(log(Standards[['Abs550nm']])~Standards[['ng_mL']])
    

    像这样适合你的模型

    mod <- lm(log(Abs550nm) ~ ng_mL, data = standards)
    

    不是更具可读性吗?

    预测您需要一个包含变量ng_mL的数据框:

    predict(mod, newdata = data.frame(ng_mL = c(0.5, 1.2)))
    

    现在您可能有第三个错误。您似乎试图用新的Absorbance值进行预测,但是您对模型的拟合方式是,Absorbance是响应变量。您需要为ng_mL提供新值。

    您看到的行为是当R无法在newdata中找到正确命名的变量时发生的行为;它返回模型中的拟合值或观察到的数据的预测值。

    这让我觉得你的公式已经回到了前面。你的意思是:

    mod2 <- lm(ng_mL ~ log(Abs550nm), data = standards)
    

    ??在这种情况下,您需要

    predict(mod2, newdata = data.frame(Abs550nm = c(1.7812,1.7309)))
    

    说。请注意,您不需要在名称中包含log()位。 R将其识别为函数并适用于变量Abs550nm

    如果模型确实是log(Abs550nm) ~ ng_mL,并且您希望为ng_mL的新值找到Abs550nm的值,则需要以某种方式反转拟合模型。< / p>