【问题标题】:Error in contrasts [duplicate]对比错误[重复]
【发布时间】:2014-05-29 10:02:25
【问题描述】:

代码如下:

data_complete<-read.delim("D:/Work/output_java_head.txt") #complete data set #working
modelfn<-function(data_complete){
  model<-lm(mctr~price+age_group+gender+brand+product_typeid+google_product_category,data=data_complete)
  data_complete$predicted<-predict(model,data_complete) 
  return(data_complete$predicted)
  sink()
  write.csv("D:/Work/output",i,".csv")
  rm(model)
  gc(TRUE)
} #working

然后使用这个命令:

by(data_complete,data_complete$google_product_category,modelfn)

我收到了这个错误:

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

请注意data_complete$google_product_category 有 117 个级别,data_complete 共有 22 列。

我也用于测试:

by(data_complete,data_complete$google_product_category,summary)

它给了我正确的答案。

所以我猜我创建的函数modelfn有问题。

【问题讨论】:

  • 非常简单的错误:你有一个只有级别的变量。我想这可能是由于缺失,但不看数据就不可能知道。
  • @Thomas 正如我上面提到的,我正在对其建模的变量有 117 个级别,我已经在 R 控制台中使用“级别”和“摘要”对其进行了测试。至于数据部分,我不能分享它,因为它是机密的。但我可以告诉你,数据已经彻底清理和测试过好几次了。

标签: r


【解决方案1】:

我不确定您在我写评论时是否相信我,但这是一个非常直接的错误,与您的一个变量只有一个观察到的水平有关。下面是一个简单的例子来演示它:

> x <- factor(rep(1,100), levels=1:20)
> y <- rnorm(100)
> lm(y~x)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

确保您的数据实际上与您认为的一样。即使一个变量附加了多个因子水平,该变量也可能在多个水平上缺乏实际观察。同样,如果您无法共享数据,我们也无法真正帮助您,因此您必须自己寻找发生这种情况的位置。

【讨论】:

  • 嘿,托马斯,当我使用您的示例并将摘要函数用作它时:summary(x) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 这表明在其他 19 个级别中没有数据或足够的数据来建立线性模型,我猜在我的数据集中可能是错误的根本原因。你怎么看?
  • 是的,这正是错误所在 - 即使该因子有水平,但没有任何观察可以达到这些水平。
  • 非常感谢@Thomas!!!现在你能建议我如何解决这个问题吗?我正在考虑 2 个选项:1)使用我不知道如何实现的 try-catch 2)跳过错误级别我是否朝着正确的方向前进?
  • @heybhai 我建议您创建一个小的示例数据集来创建问题并将其发布为关于如何最好地处理它的新问题。
  • 当然@Thomas 我今天会发布它。希望你会在那里解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2018-04-24
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多