R 错误:某些组太小而无法'qda'



我使用MASS::qda()为我的数据找到分类器,它总是报告

`某些组对于"qda"来说太小

这是因为我用于模型的测试数据的大小吗?我将测试样本量从30增加到100,它报告了同样的错误。帮助ppppppp。。。。。

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。

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()函数应该处理这个问题。。。

这个虚构的例子似乎很好用,所以你一定有一些东西没有向我们展示你的数据集。。。

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'

我也有这个错误,所以我向将来遇到这个问题的人解释了我的错误。

您可能对要预测的变量有一些因素。这个因子中的所有级别都必须有一定数量的观测值。如果你在一个小组中没有足够的观察结果,你就会得到这个错误。

对我来说,我完全去掉了一个级别,但这个因素中仍然有这个级别。

要删除这个,你必须做这个

df$var %<>% factor

NB.%<>%需要magrittr

然而,即使我这样做了,它仍然失败了。当我进一步调试它时,似乎如果您从应用了因子的数据帧中进行子集划分,您必须以某种方式再次重构。

您的分组变量有三个级别,包括非大小写的"other"。由于反应变量的数量(2个变量,即mono_score、dicot_score)大于任何给定组水平的病例数量(dicot、monocot和other分别为100、100和0),因此无法进行分析。消除不必要的组级别的一种方法是在将分组变量设置为字符后将其重新定义为因子:

test.data$type <- as.factor(as.character(test.data$type))

另一种选择是定义分组变量的级别:

test.data$type <- factor(test.data$type, levels = c("dicot", "monocot"))

如果你的数据集非常不平衡,例如有2种"其他"情况,那么将它们排除在分析之外可能是有意义的。

如果响应变量的数量大于任何给定组级别中的案例数量,则仍可能出现此消息。由于两个组水平(即dicot、monocot)都有100个病例,只有两个反应变量(即mono_score、dicot_score),这应该不再是问题。

相关内容

  • 没有找到相关文章

最新更新