tl;dr我的猜测是你的预测变量被意外地变成了因子或字符向量。如果数据集中存在一些小故障,例如一行中存在虚假字符,则很容易发生这种情况。
以下是构建与您的数据集相似的数据集的方法:
set.seed(101)
mytest <- data.frame(type=rep(c("monocot","dicot"),each=100),
mono_score=runif(100,0,100),
dicot_score=runif(100,0,100))
一些有用的诊断:
str(mytest)
## 'data.frame': 200 obs. of 3 variables:
## $ type : Factor w/ 2 levels "dicot","monocot": 2 2 22 2 2 2 ...
## $ mono_score : num 37.22 4.38 70.97 65.77 24.99 ...
## $ dicot_score: num 12.5 2.33 39.19 85.96 71.83 ...
summary(mytest)
## type mono_score dicot_score
## dicot :100 Min. : 1.019 Min. : 0.8594
## monocot:100 1st Qu.:24.741 1st Qu.:26.7358
## Median :57.578 Median :50.6275
## Mean :52.502 Mean :52.2376
## 3rd Qu.:77.783 3rd Qu.:78.2199
## Max. :99.341 Max. :99.9288
##
with(mytest,table(type))
## type
## dicot monocot
## 100 100
重要的是,前两个(str()
and summary()
)向我们展示什么type每个变量都是。Update:事实证明,在这种情况下,第三个测试实际上是重要的一个,因为问题是一个虚假的额外级别:droplevel()
函数应该解决这个问题......
这个虚构的例子似乎工作得很好,所以一定有一些你没有向我们展示的关于你的数据集的东西......
library(MASS)
qda(type~mono_score+dicot_score,data=mytest)
这是一个猜测。如果你的score
变量实际上是factors而不是数字,那么qda
会自动尝试从中创建虚拟变量,这将使模型矩阵更宽(本例中为 101 列)并引发您所看到的错误......
bad <- transform(mytest,mono_score=factor(mono_score))
qda(type~mono_score+dicot_score,data=bad)
## Error in qda.default(x, grouping, ...) :
## some group is too small for 'qda'