R语言基于现有测量值模拟额外观测/自助法采样实现咨询
R实现基于现有观测生成多组模拟测量值的两种方法
方法1:针对每行单独有放回采样(非参数自助法)
你之前直接调用sample()得到整列复制的结果,是因为没有按行单独遍历处理,用apply()按行执行采样即可解决问题,示例代码如下:
# 构造示例数据框 df <- data.frame( `1` = c(10, 20, 4, 10), `2` = c(15, 16, 6, 12), `3` = c(12, 24, 8, 9), row.names = c("A", "B", "C", "D"), check.names = FALSE ) # 定义需要生成的新观测次数:第4到15次共12次 n_new <- 12 # 按行单独做有放回采样,生成新列 new_cols <- t(apply(df, 1, function(row_vals) { sample(row_vals, size = n_new, replace = TRUE) })) # 把新生成的列和原数据合并 colnames(new_cols) <- as.character(4:(3 + n_new)) df_full <- cbind(df, new_cols)
方法2:基于正态分布的参数自助法
你提到的参数自助法实现逻辑非常简单,只需要按行估计现有观测的均值和标准差作为正态分布参数,再生成随机值即可:
n_new <- 12 # 按行估计正态分布参数并生成新观测 new_cols_param <- t(apply(df, 1, function(row_vals) { mu <- mean(row_vals) sigma <- sd(row_vals) # 若需要限制生成值的合理范围,可在此处加截断逻辑 rnorm(n = n_new, mean = mu, sd = sigma) })) # 合并到原数据 colnames(new_cols_param) <- as.character(4:(3 + n_new)) df_full_param <- cbind(df, new_cols_param)
两种方法的选择
- 非参数自助法(方法1):生成的观测值只能是现有3次测量中的值,不需要做分布假设,实现最简单
- 参数自助法(方法2):符合你提到的正态分布假设,生成的观测值可以是分布范围内的任意值,更符合真实测量的变异特征
内容的提问来源于stack exchange,提问作者drwattson
相关产品推荐
相关产品推荐

