【问题标题】:building an R loop for random sampling为随机采样构建 R 循环
【发布时间】:2012-08-21 05:47:56
【问题描述】:

我正在从一个包含许多值列表的文件中采样,例如:

312313.34
243444
12334.92
321312
353532

并使用 R 从此列表中随机抽样:

list = read.table("data")
out <-sample(list,50,replace=TRUE)
out.mean<-mean(out)
out.mean

有人可以告诉我如何将它放入一个循环中,以便我可以执行此过程 1000 次并取 1000 的平均值,这意味着这会生成吗?

非常感谢您!

鲁巴尔

【问题讨论】:

标签: r loops text sample


【解决方案1】:

我会从采样中创建一个函数,然后用lapply 一遍又一遍地重复该函数(尽管replicate 可能也可以工作,但我有过这样慢得多的经验)

我建议不要写入名为 list 的对象,因为这是一个重要功能。

所以它看起来像这样:

#make a data set that may look like yours
LIST <- rnorm(1000)

#take your code and make a function   
mean.find <- function(dat) {
    out <-sample(dat, 50,replace=TRUE)
    mean(out)
}

#a single use yo check it out 
mean.find(LIST)

#repeat it 1000 times with lapply
reps <- unlist(lapply(seq_len(1000), mean.find))

#take the mean of that
mean(reps)

【讨论】:

  • +1 和一些吹毛求疵;)。函数mean.find 有一个未使用的输入参数:dat。最好要么省略它,要么使用它,即out&lt;-sample(dat,50,replace=TRUE)。这使得函数更通用,你可以为任何数据集获取 50 个样本,并且代码不依赖于范围查找全局变量调用 dd LIST
  • @Paul 很好,这是我的意图,但我从未遵循过。我按照您的建议进行了编辑。 nitpicking = growth:D
  • 在函数中使用全局对象让我有点不安,尽管我经常使用它。在简短的脚本中,风险可能很小,但在较大的项目中,它可能导致不可预测的行为。
【解决方案2】:

另一种解决方案可能是(记住@Tyler Rinker 刚才所说的关于replicate

Data <- read.table(text='
312313.34
243444
12334.92
321312
353532', header=FALSE)

Data <- as.numeric(as.matrix((Data))) 

set.seed(007)
Means <- replicate(1000, mean(sample(Data,50,replace=TRUE))) 

对于每个大小为 50 的子样本,均值由 1000 个均值组成。如果您想要均值的均值,请执行以下操作:

mean(Means) 

您正在尝试做的事情听起来像是自举或类似于减少偏差的重采样技术(我猜)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多