如何解决predict.lm()报错:变量'affinity'的拟合类型为“nmatrix.1”,但提供了“numeric”类型。

7

我有一个简单的线性模型:

mylm = lm(formula = prodRate~affinity, mydf)

其中mydf是一个数据框,看起来像:

 prodRate    affinity

1  2643.5744 0.005164040

2  2347.6923 0.004439970

3  1783.6819 0.003322830

当我使用predict.lm()时出现了一个错误:
my_pred= predict(mylm,newdata=data.frame(affinity=seq(0,1,0.1)) )

错误:变量'affinity'被安装了"type "nmatrix.1",但提供的类型为"numeric"。

这是为什么?如何解决?谢谢!


我实际上读了那篇帖子,但不明白我的数据框mydf有什么问题,它是一个正常的数据框,有两列名称为"prodRate"和"affinity"。能否请您给我一些提示? - Paul.j
请问您能够发布 str(mydf) 吗? - user20650
str(mydf) 'data.frame': 16 行 2 列的观测值: $ prodRate: num 2644 2348 1784 1685 1416 ... $ affinity: num [1:16, 1] 0.00516 0.00444 0.00332 0.00307 0.00271 ... - Paul.j
好的,因此亲和力被添加到数据框中作为一个[16,1]矩阵而不是向量(我的术语可能有点不准确)。你是否使用mydf$affinity <- matrix(somenumbers)创建了数据框?尝试使用mydf <- data.frame(prodRate , affinity)来创建它。 - user20650
1
或者一个快速解决方法:在lm调用中将你的亲和性包装在as.vector(affinity)中,即 mylm <- lm(formula = prodRate ~ as.vector(affinity), mydf)。 - user20650
显示剩余4条评论
1个回答

9

感谢与用户20650的讨论(见上文),我们找到了这个bug:

mylm = lm(formula = prodRate~affinity, mydf)中的mydf是通过将类似矩阵的列添加到现有的数据框mydf中创建的,方法如下:

mydf$affinity = matrix(somenumber)

即mydf中的“affinity”列是由矩阵制成的,其结构仍为矩阵。这种矩阵结构和newdata=data.frame(affinity=seq(0,1,0.1))中的“affinity”列在predict(mylm,newdata=...)中不一致,后者是数字向量。

解决方案1:将mydf修正为以下内容 mydf <- data.frame(prodRate , affinity)。 即确保mydf的affinity列具有向量样式的结构。

解决方案2:保持原始的mydf,但强制使用公式中的mydf$affinity作为向量: mylm <- lm(formula = prodRate ~ as.vector(affinity), mydf) 这样,在线性模型“mylm”中的自变量“affinity”将具有向量样式的结构,而不是矩阵样式的结构,这将与newdata=data.frame(affinity=seq(0,1,0.1))中的数字向量一致。


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