运行randomForest时出错:找不到对象

9
所以,我试图为我的数据集拟合一个随机森林分类器。我对R非常陌生,我想这应该是一个简单的格式问题。
我读取一个文本文件并转换我的数据集,使其采用以下格式:(省略机密信息)
>head(df.train,2)

   GOLGA8A     ITPR3   GPR174  SNORA63    GIMAP8     LEF1    PDE4B LOC100507043    TGFB1I1    SPINT1
Sample1  3.726046 3.4013711 3.794364 4.265287 -1.514573 7.725775 2.162616    -1.514573 -1.5145732 -1.514573
Sample2 4.262779 0.9261892 4.744096 7.276971 -1.514573 4.694769 4.707387     2.031476 -0.8325444  2.615991
...
...
CD8B     FECH    PYCR1 MGC12916     KCNA3 resp
Sample1  -1.514573 2.099336 3.427928 1.542951 -1.514573    1
Sample2 -1.145806 1.204241 2.846832 1.523808  1.616791    1

本质上,列是我的特征,行是我的样本,最后一列是我的响应向量,它是一个因素列,resp。

然后我使用:

set.seed(1) #Set the seed in order to gain reproducibility

RF1 = randomForest(resp~., data=df.train,ntree=1000,importance=T,mtry=3)

我试图使用其他列作为特征,对我的列 resp 进行 RF 训练。

但是我收到了错误信息:

Error in eval(expr, envir, enclos) : object 'PCNA-AS1' not found

然而,通过查看我的训练集,我可以清楚地找到该列,例如使用以下方法:
sort(unique(colnames(df.train))

所以我真的不理解这个错误,也不知道该从哪里继续下去。如果我没有正确地提出问题,请谅解,并感谢您的所有帮助!


你能否提供一个可重现的例子(即提供导致错误的df.train样本数据)? - josliber
2个回答

23

我猜测这可能是由于数据框中存在非法变量名称导致的。让我们考虑一个只有一个响应变量resp和一个(非法命名的)变量PCNA-AS1的数据框:

(dat <- structure(list(`PCNA-AS1` = c(1, 2, 3), resp = structure(c(2L, 2L, 1L), .Label = c("0", "1"), class = "factor")), .Names = c("PCNA-AS1", "resp"), row.names = c(NA, -3L), class = "data.frame"))
#   PCNA-AS1 resp
# 1        1    1
# 2        2    1
# 3        3    0

现在当我们训练一个随机森林时,我们会得到指定的错误:

library(randomForest)
mod <- randomForest(resp~., data=dat)
# Error in eval(expr, envir, enclos) : object 'PCNA-AS1' not found

解决这个问题的一个自然方法是将变量名全部转换为合法的名称:

names(dat) <- make.names(names(dat))
dat
#   PCNA.AS1 resp
# 1        1    1
# 2        2    1
# 3        3    0
mod <- randomForest(resp~., data=dat)

现在模型训练时没有错误。


2
感谢您的评论Josilber,我尝试将名称转换为合法名称,但这不是问题所在。实际上,错误在于我给了randomForest一个矩阵(而不是数据框),我认为这并不重要,而且randomForest可以轻松地在两者之间进行转换。但我错了,现在我已经解决了这个问题。 - AHawks
@AHawks,那么你更应该编辑你的问题以使其可重现!(即包括代码和数据以复制问题)。尝试将数据框中的列减少到最小数量,以便您可以重现问题,然后发布该数据集(如果您还没有弄清楚发生了什么)。 - josliber
是的,你绝对是正确的,那样做会更好,我会在以后的问题中这样做,只是需要适应在Stack Overflow上呈现问题,所以感谢你的建议! - AHawks

0

简而言之,这是一个非常新手级的错误,我输入的是矩阵而不是数据框,导致了这个错误。为什么它会抱怨关于那特定列(而不是第一列)与另一项相比,我仍然不理解。

感谢所有的帮助。

祝好,安东尼


创建/转换数据框时,请检查check.names=TRUE。因此,输入数据框可以解决非法列名的问题。通常情况下,与矩阵相比,randomForest在数据框方面出现的问题要少得多。 - Soren Havelund Welling
5
这不是一个答案,而是对真正答案的评论,应该将其标记为被采纳的答案。 - Cath

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