“对比”错误中的错误

Posted

技术标签:

【中文标题】“对比”错误中的错误【英文标题】:Error in `contrasts' Error 【发布时间】:2018-04-24 22:57:24 【问题描述】:

我已经训练了一个模型,我正在尝试使用 predict 函数,但它返回以下错误。

contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]]) 中的错误: 对比只能应用于具有 2 个或更多级别的因素

SO 和CrossValidated 中有几个关于此的问题,根据我对这个错误的解释,我的模型中的一个因素只有一个级别。

这是一个非常简单的模型,有一个连续变量 (driveTime) 和一个因子变量,它有 3 个级别

 driveTime         Market.y      transfer
 Min.   : 5.100   Dallas :10   Min.   :-11.205  
 1st Qu.: 6.192   McAllen: 6   1st Qu.:  3.575  
 Median : 7.833   Tulsa  : 3   Median :  7.843  
 Mean   : 8.727                Mean   :  8.883  
 3rd Qu.:10.725                3rd Qu.: 15.608  
 Max.   :14.350                Max.   : 30.643

当我使用预测函数来确定未见过样本的结果时

newDriveTime <- data.frame(driveTime =  8,Market.y = as.factor("Dallas"))
predict(bestMod_Rescaled, newDriveTime)

我收到以下错误

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

这是我的更多工作流程

tc          <- tune.control(cross = 10, fix = 8/10)

    tuneResult_Rescaled <- tune(svm,data = finalSubset,
                                transfer~ driveTime + Market.y,
                                ranges = list(epsilon = seq(0.1,.5,0.1),
                                              cost = seq(8,10,.1)), tunecontrol=tc)

    summary(tuneResult_Rescaled)


    bestMod_Rescaled <- tuneResult_Rescaled$best.model

【问题讨论】:

您在未见过的样本中只选择了一个水平因子:Market.y = as.factor("Dallas"),对吧? @jsb 是的,这是正确的。我只有一个看不见的样本要测试。 这可能就是您收到错误的原因。 你能提供一个最小的reprex吗? 【参考方案1】:

我认为您还必须将训练数据中的因子水平提供给测试集。像下面这样的东西应该可以工作。

newDriveTime <- data.frame(driveTime =  8, 
                    Market.y = factor("Dallas", levels(finalSubset$Market.y)))

predict(bestMod_Rescaled, newDriveTime)

在 R 中,因子被保存为带有名称/标签的整数。如果您有两个具有不同级别数的因子向量,仅通过查看标签,无法确定哪些标签是两个向量中的对应级别。

【讨论】:

感谢您的回答。有效。你能解释一下发生了什么吗? 我已经编辑了答案以插入一点解释。希望清楚。 感谢您的解决方案。我已经看到了很多关于这个主题的冗长而复杂的答案,但你的答案很简单,很快就解决了我的问题。

以上是关于“对比”错误中的错误的主要内容,如果未能解决你的问题,请参考以下文章

带有数字变量的`对比度<-`(`*tmp*`,value = contr.funs[1 + isOF[nn]])中的错误[重复]

Java中的一些常见错误

`contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) 中的错误:对比只能应用于具有 2 个或更多级别的因子

一个关于对比(参考基因组)的弱智错误

debug底层java代码,对list中的数据去重的正确姿势,及对比java list remove正确使用方法与错误使用

Java和C#中的接口对比(有你不知道的东西)