【问题标题】:Generating n new datasets by randomly sampling existing data, and then applying a function to new datasets通过随机抽样现有数据生成 n 个新数据集,然后将函数应用于新数据集
【发布时间】:2019-10-28 14:02:13
【问题描述】:

对于我正在写的一篇论文,我将一个较大的数据集分为 3 个组,因为我认为这些组中 2 个变量之间的相关强度会有所不同(他们确实如此)。我想看看将我的数据分成随机分组是否也会显着影响相关性的强度(即,我所看到的是否只是子集的影响,或者这些分组是否真的很重要)。

为此,我试图通过从现有数据集中随机抽样 150 行来生成 n 个新数据帧,然后想计算这些 n 新数据帧,将相关系数和显着性保存在新文件中。

但是,怎么做?

我可以手动完成,例如,使用 dplyr,类似

newdata <- sample_n(Random_sample_data, 150)
output <- cor.test(newdata$x, newdata$y, method="kendall")

我显然不想输入 1000 或 100000 次,并且一直在尝试使用循环和 lapply(见下文)但它们没有奏效(无疑是因为我错过了一些非常明显的东西! )。

在这里,我尝试将每一行分配给不同的组,总共 10 个组,然后通过这些组在 xy 之间进行关联:

Random_sample_data<-select(Range_corrected, x, y)
cat <- sample(1:10, 1229, replace=TRUE)
Random_sample_cats<-cbind(Random_sample_data,cat)

correlation <- function(c) {
  c <- cor.test(x,y, method="kendall")
  return(c)
}
b<- daply(Random_sample_cats, .(cat), correlation)

错误信息:

Error in cor.test(x, y, method = "kendall") : 
      object 'x' not found

【问题讨论】:

  • 您的循环尝试似乎与手动尝试不一致。如果您需要手动尝试 1000 次,只需将两行都包含在 for(i in 1:1E3) ... 中或将 cor.test 结果保存在带有 lapply(1:1E3, ...) 的列表中,或者使用 replicate 更好。

标签: r loops random lapply


【解决方案1】:

一旦你有你想做的事情的代码,你可以把它放在replicaten 次。这是内置数据的可重现示例

result = replicate(n = 10, expr = {
  newdata <- sample_n(mtcars, 10)
  output <- cor.test(newdata$wt, newdata$qsec, method="kendall")
})

replicate 将保存您为每个复制所做的最后一行 (output &lt;- ...) 的结果。它将尝试简化结果,在这种情况下,cor.test 返回一个长度为 8 的列表,因此复制会将结果简化为具有 8 行和 10 列的矩阵(每次复制 1 列)。

可能想要稍微清理一下结果,例如,您只保存 p 值。在这里,我们只存储 p 值,所以结果是一个向量,每次复制都有一个 p 值,而不是矩阵:

result = replicate(n = 10, expr = {
  newdata <- sample_n(mtcars, 10)
  cor.test(newdata$wt, newdata$qsec, method="kendall")$p.value
})

【讨论】:

  • 它告诉我不要只写“谢谢”,但我会冒着犯罪的风险......这非常有效,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2018-08-08
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多