我使用qda {MASS}查找我的数据的分类器,并始终报告“some group is too small for 'qda'
”。是否由于我用于模型的测试数据的大小?我将测试样本大小从30增加到100,它报告了相同的错误。 Helpppppppp .....
set.seed(1345)
AllMono <- AllData[AllData$type == "monocot",]
MonoSample <- sample (1:nrow(AllMono), size = 100, replace = F)
set.seed(1355)
AllEudi <- AllData[AllData$type == "eudicot",]
EudiSample <- sample (1:nrow(AllEudi), size = 100, replace = F)
testData <- rbind (AllMono[MonoSample,],AllEudi[EudiSample,])
plot (testData$mono_score, testData$eudi_score, col = as.numeric(testData$type), xlab = "mono_score", ylab = "eudi_score", pch = 19)
qda (type~mono_score+eudi_score, data = testData)
这是我的数据示例
>head (testData)
sequence mono_score eudi_score type
PhHe_4822_404_76 DTRPTAPGHSPGAGH 51.4930 39.55000 monocot
SoBi_10_265860_58 QTESTTPGHSPSIGH 33.1408 2.23333 monocot
EuGr_5_187924_158 AFRPTSPGHSPGAGH 27.0000 54.55000 eudicot
LuAn_AOCW01152859.1_2_79 NFRPTEPGHSPGVGH 20.6901 50.21670 eudicot
PoTr_Chr07_112594_90 DFRPTAPGHSPGVGH 43.8732 56.66670 eudicot
OrSa.JA_3_261556_75 GVRPTNPGHSPGIGH 55.0986 45.08330 monocot
PaVi_contig16368_21_57 QTDSTTPGHSPSIGH 25.8169 2.50000 monocot
>testData$type <- as.factor (testData$type)
> dim (testData)
[1] 200 4
> levels (testData$type)
[1] "eudicot" "monocot" "other"
> table (testData$type)
eudicot monocot other
100 100 0
> packageDescription("MASS")
Package: MASS
Priority: recommended
Version: 7.3-29
Date: 2013-08-17
Revision: $Rev: 3344 $
Depends: R (>= 3.0.0), grDevices, graphics, stats, utils
我的R版本是R 3.0.2。
答案 0 :(得分:2)
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()
和summary()
)向我们展示了每个变量的类型。 更新:事实证明,在这种情况下,第三个测试实际上是重要测试,因为问题是虚假的额外级别:droplevel()
函数应该解决这个问题... < / p>
这个示例似乎工作得很好,所以一定有些东西你没有向我们展示你的数据集......
library(MASS)
qda(type~mono_score+dicot_score,data=mytest)
这是一个猜测。如果您的score
变量实际上是因子而不是数字,那么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'
答案 1 :(得分:0)
我也有此错误,所以我向将来解释任何遇到此问题的人说了什么错。
您可能对要预测的变量有影响。该因素中的所有水平都必须有一定数量的观察结果。如果组中没有足够的观测值,则会出现此错误。
对我来说,我完全删除了一个级别,但是这个级别中仍然剩下这个级别。
要删除它,您必须这样做
df$var %<>% factor
NB。 %<>%需要magrittr
但是,即使我这样做,它仍然失败。当我进一步调试时,似乎如果您从已应用因子的数据帧中子集化,则必须以某种方式再次进行重构。