如何在R中重复downSample?

问题描述

我不确定对这个问题采取什么方法(我是 R 和统计分析的新手)。我的数据集中有一个高度不平衡的类:


  PCL_Sum     n
*     <dbl> <int>
1         0   300
2         1    25

我意识到我可以对这些数据使用 downSample 来获得一个平衡集,其中包含 25 个随机选择的 0 和我现有的 25 个 1。但是,我想重复这个过程 12 次,以便使用我所有的“0”数据,剩下 12 组数据。

我意识到我可以手动完成 12 次,但我想自动化该过程。有人能给我一个他们将如何解决这个问题的一般想法吗?我意识到那里可能有一个答案,但我无法理解我找到的文档。谢谢!

解决方法

downSample 有什么不好的地方吗?看起来你可以只应用它 12 次,然后从那里开始你的样品。这是一个例子。

data(oil)
table(oilType)
downSample(fattyAcids,oilType)
mysamples <- lapply(1:12,function(x){downSample(fattyAcids,oilType)})

然后您可以为第一组调用 mysamples[[1]],依此类推。

> mysamples[[1]]
   Palmitic Stearic Oleic Linoleic Linolenic Eicosanoic Eicosenoic Class
1      11.5     5.1  27.8     54.5       0.2        0.4        0.1     A
2      11.4     5.8  34.5     48.3       1.0        0.1        0.1     A
3       6.1     4.1  24.0     64.3       0.1        0.3        0.1     B
4       6.1     4.1  26.7     61.0       0.6        0.3        0.2     B
5       9.7     3.4  59.3     20.5       0.1        1.5        1.2     C
6       9.6     3.3  57.7     20.7       0.2        1.5        1.8     C
7       9.3     2.8  65.0     17.0       3.9        0.5        0.7     D
8      10.9     2.7  76.7      7.9       0.8        0.1        0.1     D
9      10.9     3.6  26.0     52.6       5.5        0.4        0.2     E
10     10.5     4.2  24.4     52.1       7.5        0.4        0.1     E
11      5.4     2.0  53.2     28.9       7.3        0.6        1.3     F
12      5.1     2.3  55.9     27.4       6.8        0.5        0.5     F
13     10.0     2.3  36.9     47.1       2.2        0.5        0.5     G
14     10.7     1.8  30.2     55.5       0.9        0.5        0.3     G
> mysamples[[2]]
   Palmitic Stearic Oleic Linoleic Linolenic Eicosanoic Eicosenoic Class
1      13.0     6.2  25.8     55.0       0.8        0.1        0.1     A
2      13.1     5.7  31.7     49.5       0.6        0.1        0.1     A
3       5.6     4.2  25.7     58.9       1.7        2.8        0.9     B
4       6.1     4.1  24.0     64.3       0.1        0.3        0.1     B
5       9.6     3.3  57.7     20.7       0.2        1.5        1.8     C
6      10.0     3.3  60.0     21.3       0.2        1.5        1.3     C
7       9.3     2.8  65.0     17.0       3.9        0.5        0.7     D
8      14.9     2.6  68.2     12.8       0.6        0.4        0.3     D
9      10.9     3.6  26.0     52.6       5.5        0.4        0.2     E
10      9.7     3.9  25.1     54.2       5.9        0.1        0.1     E
11      5.1     2.3  55.9     27.4       6.8        0.5        0.5     F
12      5.5     1.7  59.0     21.3       9.3        0.6        1.5     F
13     10.7     1.8  30.2     55.5       0.9        0.5        0.3     G
14     10.0     2.3  36.9     47.1       2.2        0.5        0.5     G

编辑独特的样本:

df <- data.frame(class = c(rep("A",25),rep("B",300)),value = 1:325)
mysamples <- lapply(1:12,function(x){df[c(1:25,(x * 25 + 1) : ((x+1) * 25)),]})

这将取样本 1 中多数类的前 25 个,样本 2 中的后 25 个,依此类推,直到第 12 个样本。

,

我们也可以使用 replicate

library(caret)
out <- replicate(12,downSample(fattyAcids,oilType),simplify = FALSE)