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

Posted

技术标签:

【中文标题】R predict() 函数返回错误/太多值【英文标题】:R predict() function returning wrong/too many values 【发布时间】:2014-11-25 15:17:17 【问题描述】:

我正在尝试根据已建立的线性模型和标准曲线将吸光度 (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) 条目获取单个预测浓度值。能够一次预测所有条目并将它们添加到现有数据框中会很好,但我什至无法正确地给我一个值。我已经阅读了这里的许多主题、在 Google 上找到的网页以及所有帮助文件,而对于我来说,我无法理解这个功能发生了什么。任何帮助将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

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

你有两个错误:

    您不要在 newdata 中使用与用于拟合模型的协变量同名的变量,并且 由于滥用了公式界面,使问题更难以解决。

不要这样拟合你的模型:

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() 好吧,就 R 而言,公式是 response ~ predictor ,因此 predict() 将为您提供 response 的新值 predictor 给定模型。在您的 y=mx+b 的情况下,这里 y 是 log(Abs550nm)xng_mL 给定您使用的公式。如果这确实是模型,那么就像我说的那样,您需要将其反转以根据x 而不是y 来获得方程,并且R 不会进行反转,因为那是非标准的。请注意,您可以通过 coef(mod) 从等式中获得 m 和 b。

以上是关于R predict() 函数返回错误/太多值的主要内容,如果未能解决你的问题,请参考以下文章

Python:读取两个 csv 文件组合成一个新的 cvs 文件,错误:太多值无法解压

Python:读取两个 csv 文件组合成一个新的 cvs 文件,错误:太多值无法解压

在 for 循环中使用 str.split 时出现“ValueError 太多值无法解包”

ValueError : 太多值无法解包

R语言glm模型预测(predict)过程及Error in eval(predvars, data, env) 错误原因

IF 条件返回太多值