R采样的力量:探索多功能的sample函数






R采样的力量:探索多功能的sample函数

小师妹  生信果  2023-08-20 19:00:27

 { 点击蓝字,关注我们 }

介绍

实验设计和抽样调查是生物信息科学的基本技术,可以使我们得出更有意义的见解。其中抽样调查通过构建代表性子集,我们可以对更大的群体做出统计推断。在基因表达研究中,往往会面对大规模的基因表达数据。为了避免对所有基因进行全面测量和分析,可以通过抽样的方式选取一小部分基因样本,代表整体的基因表达特征。在蛋白质组学研究中,抽样方法也经常用于质谱数据的处理和分析。通过对蛋白质样本进行抽样,可以减少大量数据的处理负担,并提高数据分析效率。


R语言中的sample()函数是一个功能健全的函数,可以使我们高效地创建随机样本。下面小师妹将通过一系列简单的示例来探索该函数的各种应用。

首先,小师妹带大家看一下语法:

sample(x, size, replace = FALSE, prob = NULL)

其中:

  • x是我们的样本数据集,也就是需要从中抽取的数据集

  • size是规定的抽取的样本中包含的元素个数

  • replace是一个逻辑值,指示是否为无放回抽样(默认为FALSE)

  • prob是可用于对样本进行加权的概率向量(默认为 NULL)

例子

示例 1:简单随机采样

简单随机抽样真是太常见了,让小师妹来帮你解释一下!😊

嗯嗯,想象一下,我们有一个超级酷的数据集,里面有80个人的年龄数据,每个人的年龄都不一样,从1岁到80岁,统统都有。


现在,我们想要创建一个小样本,只要10个人的年龄数据,而且希望每个人的机会都一样,被选中的概率都一样。嘿嘿,就像每个人都在抢糖果一样,大家都有平等的机会得到糖果!


好消息是,可以用一个特殊的函数来实现这个神奇的抽样!它就叫做sample()函数。我们只要告诉它,从总共80个人中,要抽取10个人,它就会自动帮我们随机选出这10个人的年龄数据,还保证每个人的选中概率都是相等的。


这样,我们就得到了一个小小的样本,里面有10个人的年龄数据,它们就好像是总体的代表,告诉我们总体年龄的一些特征:

#创建年龄为1到80的80个人总体  ages <- 1:80  #随机数种子,保证每次抽样结果相同  set.seed(123)  #采用sample函数进行简单随机抽样  rsample <- sample(ages, size = 10)  rsample  [1] 31 79 51 14 67 42 50 43 77 25sample()函数从向量中随机选择10个值ages,不进行放回,从而产生一个新向量rsample。该技术代表简单随机抽样,其中群体中的每个个体都有平等的机会被纳入样本,是不是例如其名,很简单呢。

示例 2:放回抽样

有放回抽样就像是我们在玩一个有趣的小游戏。我们有一个袋子,里面装满了彩色球,有红色、蓝色、绿色等等。现在我们想要模拟抽取10个球,然后把抽出来的球放回去,再继续抽10个,反复进行好几次。


为了实现这个目标,我们会用一个小纸条来记录每次抽取的球的颜色,并把它放回袋子里。然后再次摇动袋子,再次抽出10个球。这样,每个球都有可能被多次选中,就像它在袋子里玩“闹腾”一样。😄🎉


有放回抽样适用于那些我们允许样本可以重复出现的情况。通过多次抽样,我们可以更好地了解总体的特点:

#创建一个颜色总体,共有四种颜色对象  colors <- c("red", "blue", "green", "yellow")  set.seed(123)  #有放回抽样  sample_with_replace <- sample(colors, size = 10, replace = TRUE)  sample_with_replace  [1] "green" "green" "green" "blue" "green" "blue" "blue" "blue" "green" "red"

sample()函数带有replace = TRUE参数,使我们能够从colors向量中随机选择10种颜色,并允许重复。这种方法代表放回抽样,其中每个选择都独立于之前的选择。


示例 3:加权采样

嘿嘿,小师妹听说你想知道加权采样,这可是抽样领域里的大咖!它是一种神奇的抽样方法,有点像我们在做任务的时候,对优秀同学给予额外的赞扬,或者对捣蛋鬼多一点额外的监督。说白了,就是给不同的样本设置不同的权重,有些样本更有份量,就给它们“加分”。


你也许会问,加权采样有什么用呢?哼哼,它可厉害了!在我们处理一些特殊情况的数据时,比如某些样本的重要性不一样,或者数据分布不均匀,加权采样就上场了!它能够让我们更专注于那些真正重要的样本,让它们在我们的实验中占据更大的“话语权”。


假设我们有一个项目列表和相应的权重,表示它们被选择的概率。我们可以使用带参数的sample()函数prob来实现加权采样。考虑以下示例:

library(dplyr)  set.seed(123)  items <- c("apple", "banana", "orange")  weights <- c(0.4, 0.2, 0.4)  weighted_sample <- sample(items, size = 1, prob = weights)  weighted_sample [1] "apple"
tibble(x = 1:10) |>    group_by(x) |>    mutate(rs = sample(items, size = 1, prob = weights)) |>    ungroup() # A tibble: 10 x 2x rs
1     1 orange2     2 orange3     3 banana4     4 banana5     5 apple6     6 orange7     7 banana8     8 orange9     9 orange10    10 banana

小可爱果然了解sample()函数的强大之处!没错,通过指定prob参数,我们可以实现带权重的随机抽样,让“苹果”和“橙子”有更高的概率被选中,而“香蕉”则稍微低一些。


咱们假设有一个水果篮子,里面有三种水果:“苹果”、“橙子”和“香蕉”。现在,我们希望从篮子中随机抽一个水果,但是要让“苹果”和“橙子”有40%的概率被选中,而“香蕉”只有20%的概率。


示例 4:分层抽样

分层抽样是一个很聪明的方法,,我们可以使用sample()函数的附加参数来实现分层抽样,确保每个学科的学生比例在样本中得到保持。小师妹带大家看看下面的示例:

假设有一个学生成绩的数据集,其中包含数学、英语和历史三个学科的成绩。我们想要从这个数据集中抽取一个样本,让样本中的学生比例与总体中的学生比例保持一致。


我们可以先将数据集按照学科进行分组,然后分别计算每个学科在总体中的学生比例。接着,我们使用sample()函数来从每个学科的子组中进行抽样,并设置附加参数weights,以保持每个学科的比例。具体代码如下:

#分层抽样  # 设置随机数种子,以保证结果的可重复性  set.seed(123)  # 创建一个包含学科名称的向量  subjects <- c("Math", "Science", "English", "History")  # 创建包含学生成绩的向量  grades <- c(80, 90, 85, 70, 75, 95, 60, 92, 88, 83, 78, 91)  # 将学科向量转换为因子,用于后面的分层抽样  strata <- factor(subjects)    # 使用分层抽样从每个学科中抽取两个成绩  # by()函数将成绩按照学科进行分组,rep(strata, 3)用于指定每个学科的重复次数为3  # FUN参数指定抽样函数,这里使用sample函数随机抽取两个成绩  stratified_sample <- unlist(    by(      grades,       rep(strata, 3),       FUN = function(x) sample(x, size = 2)    )  )  # 输出分层抽样的结果  stratified_sample  English1 English2 History1 History2    Math1    Math2 Science1 Science278       85       91       92       88       75       95       83

在这个示例中,我们使用by()函数按科目( )对成绩进行分组。然后,我们使用FUN参数将sample()函数应用于每个子组。结果是每个科目的两个成绩的分层样本,保持最终样本中学生的相对比例。

结论

R中的sample()函数确实是一个非常强大的工具,它能够帮助我们实现各种不同的随机抽样技术,从而更好地理解数据、做出决策和获得见解。


无论需要进行简单随机抽样、放回抽样、加权抽样,甚至是分层抽样,sample()函数都可以轻松胜任。通过熟悉不同的参数设置,我们可以根据实际情况选择合适的采样技术,从而从数据中获取有价值的信息。所以,让我们继续探索sample()函数的各种功能吧!无论您是在进行生信分析、机器学习还是其他数据处理任务,都可以借助这个神奇的函数释放数据的潜力,做出明智的决策。


小伙伴们,今天有没有学到新知识呢,想要继续了解R语言内容可以持续关注小师妹哦~~或者也可以关注我们的官网也会持续更新的哦~ http://www.biocloudservice.com/home.html那么大家一起加油,继续探索采样的奇妙世界吧!🎉📊📚

END