有没有一种方法可以创建一个循环,我提供一个函数和 Dataframe ,并对它进行子采样,然后用子采样重复函数N次?

cdmah0mi  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(78)

我不知道正确的词是什么,所以很抱歉把术语弄错了。基本上我有大约1000个数据点,我想随机对100个数据点进行999次子采样,并对每个子样本执行相同的函数(广义最小二乘模型),看看相关性有多显著。
我还添加了一些上下文,以防有帮助。我的数据是在一个数据框架与各种列,我正在做一个比较,如果有一个高度和二色性之间的关系,以及两者之间的关系是否有所不同,这取决于是否使用分光光度计或人类评分测量二色性。我还在这些模型中包括了物种范围的纬度质心,因此每个模型的PGLS如下所示:

PGLS_VO_Score <- gls(Colour_discriminability_Absolute ~ Altitude_Reported*Centroid.Abs, 
                          correlation = corPagel(1, phy = AvianTreeEdge, form = ~Species), 
                          data = VO_HumanScores_Merged, method = "ML")

PGLS_Human_Score <- gls(Human_Score ~ Altitude_Reported*Centroid.Abs, 
                        correlation = corPagel(1, phy = AvianTreeEdge, form = ~Species), 
                        data = VO_HumanScores_Merged, method = "ML")

VO_Human_Scores_Merged的数据框包括一列物种名称、人类评分、分光光度计评分、海拔、纬度,然后是这些数据的一些转换值(对数转换等),我在开始时确实这样做了,以防我需要转换数据以满足PGLS的假设。

wnavrhmk

wnavrhmk1#

管道采样有助于查看此处可执行的操作:

myfun <- function(x) cor(x[[1]], x[[3]])
set.seed(42)
replicate(5, mtcars[sample(nrow(mtcars), 10),], simplify=FALSE) |>
  lapply(myfun)
# [[1]]
# [1] -0.8130999
# [[2]]
# [1] -0.8633841
# [[3]]
# [1] -0.7967049
# [[4]]
# [1] -0.901294
# [[5]]
# [1] -0.8761853

(My 5是你的999,我的10是你的100
simplify=FALSE是必需的,因为否则replicate将减少到(嵌套)矩阵,而不是我们想要的。我的myfun是人为的,使用任何你想要的功能。
在管道中将其分解为两个(或更多)步骤的(可能是唯一的)优点是,如果您想返回重新访问随机采样,如果您保存随机采样,则会简单得多。比如说,

set.seed(42)
sampdat <- replicate(5, mtcars[sample(nrow(mtcars), 10),], simplify=FALSE)
lapply(sampdat, myfun)
# [[1]]
# [1] -0.8130999
# [[2]]
# [1] -0.8633841
# [[3]]
# [1] -0.7967049
# [[4]]
# [1] -0.901294
# [[5]]
# [1] -0.8761853

如果您后来意识到您需要对样本数据做一些其他的事情(另一个指标或其他什么),并且您不想(为了时间、内存或方便)重新运行所有其他的样本聚合,您可以重用sampdat

cwtwac6a

cwtwac6a2#

您可以使用sample从数据点中随机抽取样本。然后你可以使用replicate运行你的函数n次。一个例子,取n=100的随机样本,并计算平均值10次:

> set.seed(1)
> datapoints <- runif(1000, max = 10000)
> result <- replicate(10, mean(sample(datapoints, 100)))
5194.298 5063.320 5064.992 4681.281 5008.011 4849.998 5320.206 5012.931 4900.636 4776.135

相关问题