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

7

我正在尝试根据已建立的线性模型和标准曲线将吸光度(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 

看起来这不是我想要的输出结果。我正在尝试为每个吸光度(Abs)条目获取一个单一的预测浓度值。能够一次性预测所有条目并将它们添加到现有数据框中会很好,但是我甚至无法正确地得到一个单一的值。我在这里读了许多帖子,通过谷歌找到了许多网页和所有的帮助文件,但是我死也无法理解这个函数到底在做什么。感谢任何帮助。

1个回答

17

在拟合模型时,必须确保newdata中存在一个与最初用于拟合模型的模型公式中使用的变量名称相同的变量。

您有两个错误:

  1. 您没有在 newdata 中使用与用于拟合模型的协变量相同名称的变量,以及
  2. 您滥用了公式界面,使问题难以解决。

不要像这样拟合模型:

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

现在你可能会遇到第三个错误。你似乎试图使用新的吸光度值进行预测,但是根据你拟合模型的方式,吸光度是响应变量。你需要提供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,并且您想要找到新Abs550nm值的ng_mL值,则需要以某种方式反转拟合模型。


我是不是把模型搞反了?现在我不确定了...当我生成标准曲线时,我使用已知浓度(ng/mL)来测量吸光度(Abs)。那么,这将使浓度成为“术语”因素,而Abs将成为“响应”因素,对吗?所以,Abs ~ Conc。当我运行实验时,我测量样品的吸光度以找到浓度。这是否意味着我必须交换公式?过去,我只是根据线性模型将Abs插入y=mx+b的公式中。这次,我想尝试predict()。 - user3658874
就R而言,公式为response ~ predictor,因此predict()将为给定模型的预测器值提供新的response值。在您的情况下,y=mx+b,其中y是log(Abs550nm)x是根据您使用的公式中的ng_mL。如果确实是这个模型,那么就像我说的那样,您需要将其反转以获得关于x而不是y的方程,而R不会进行反转,因为这是非标准的。请注意,您可以通过coef(mod)从您的方程式中获取m和b。 - Gavin Simpson

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