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 25
sample()函数从向量中随机选择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 2
x rs
1 1 orange
2 2 orange
3 3 banana
4 4 banana
5 5 apple
6 6 orange
7 7 banana
8 8 orange
9 9 orange
10 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 Science2
78 85 91 92 88 75 95 83
在这个示例中,我们使用by()函数按科目( )对成绩进行分组。然后,我们使用FUN参数将sample()函数应用于每个子组。结果是每个科目的两个成绩的分层样本,保持最终样本中学生的相对比例。
结论
R中的sample()函数确实是一个非常强大的工具,它能够帮助我们实现各种不同的随机抽样技术,从而更好地理解数据、做出决策和获得见解。
无论需要进行简单随机抽样、放回抽样、加权抽样,甚至是分层抽样,sample()函数都可以轻松胜任。通过熟悉不同的参数设置,我们可以根据实际情况选择合适的采样技术,从而从数据中获取有价值的信息。所以,让我们继续探索sample()函数的各种功能吧!无论您是在进行生信分析、机器学习还是其他数据处理任务,都可以借助这个神奇的函数释放数据的潜力,做出明智的决策。
小伙伴们,今天有没有学到新知识呢,想要继续了解R语言内容可以持续关注小师妹哦~~或者也可以关注我们的官网也会持续更新的哦~ http://www.biocloudservice.com/home.html那么大家一起加油,继续探索采样的奇妙世界吧!🎉📊📚
END