【问题标题】:two sided ks test loop, get p.value两侧 ks 测试循环,得到 p.value
【发布时间】:2016-05-16 18:22:32
【问题描述】:

我有一列数据,我从中抽取 50% 的随机子样本。 我正在运行一个双边 ks 测试来比较数据的50% 的分布与 100% 的数据,看看分布是否仍然显着拟合。

为了实现我的目标,我想以 1000 个循环运行它,以从 1000 个随机子样本中获取平均 p 值。这行代码为我的样本的 50% 的随机子集提供了一个 p 值:

dat50=dat[sample(nrow(dat),replace=F,size=0.50*nrow(dat)),]
ks.test(dat[,1],dat50[,1], alternative="two.sided")

我需要一行代码来运行这 1000 次,每次将结果(不同的)p 值保存在我可以平均的列中。我试图开始工作的代码如下所示:

x <- numeric(100)
for (i in 1:100){
  x<- ks.test(dat[,7],dat50[,7], alternative="two.sided")
  x<-x$p.value
}

但是这不会存储多个 p 值

也试过这个:

get.p.value <- function(df1, df2) {
  x <- rf(5, df1=df1, df2=df2)
  p.value <- ks.test(dat[,6],dat50[,6], alternative="two.sided")$p.value
}
replicate (2000, get.p.value(df1 = 5, df2 = 10))

我希望这很清楚,并且非常感谢任何帮助解决这个问题!

【问题讨论】:

  • 这没有任何意义。您知道子样本是从完整变量中提取的,因此您知道 null 为真。你为什么做这个?您在这里的最终目标是什么?
  • 感谢您的回复!我正在比较抽样策略的代表性,我有一个来自一种方法的 137 个样本的数据集,我的问题是需要多少样本才能通过随机抽样在统计上满足相同的代表性。因为整个数据集的空间覆盖非常好,所以不需要重新采样,因为我可以随机抽取一个子集。我的变量分布不正常,所以我想我可以通过使用两侧 ks 检验来确定 50% 的子样本是否代表完整样本的分布。
  • reply continue 唯一的问题是,50% 样本的随机子集可以给我一个介于 0.5 和 1 之间的 p 值,具体取决于我随机抽取的次数子样本。为了解决这个问题,我想我可以从随机化中获取 p 值 1000 次并对结果进行平均。只是还没有很好地学习 r 来构建代码。希望能解释一下

标签: r p-value kolmogorov-smirnov


【解决方案1】:

在您的 for 循环中,您将在每次迭代中覆盖 x,这意味着您只会保存最后一次迭代的 p 值。试试这个:

x <- numeric(100)
for (i in 1:length(x))
    x[i] <- ks.test(dat[,17], dat[sample(nrow(dat), replace=F, size=0.5*nrow(dat)),7])$p.value

您可以使用replicate 获得相同的结果:

 replicate(100, ks.test(dat[,7], dat[sample(nrow(dat), replace=F, size=0.5*nrow(dat)),7])$p.value)

【讨论】:

  • 非常感谢!第一行似乎奏效了!
  • “复制”代码似乎出现:数据错误[sample(nrow(dat), replace = F, size = 0.5 * nrow(dat)), : object of type 'closure ' 不是可子集的而且我不确定在哪里可以找到这个的 p 值。我可以通过运行'x'在第一个代码中回忆它们。第一个代码实现了一个梦想,再次感谢!
  • 修复了 replicate 示例中的错字。
  • 啊,我没发现。再次感谢!
猜你喜欢
  • 2021-04-14
  • 2017-12-26
  • 2020-02-17
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2011-01-22
相关资源
最近更新 更多