如何创建可重复N次、存储Mardia's b1p的q0行1列向量?
解决Mardia's b1p统计量存储的循环赋值问题
问题原因分析
你遇到的问题核心是两个常见错误:
- 循环中仅计算单个b1p值,重复赋值给q0行,导致同一次重复内所有行值完全相同
- 索引操作失误或初始化不当,导致后续重复段无法正确赋值,出现批量NA
修正后的R代码示例
以下是符合需求的最小工作代码,确保每次重复的q0行都是独立计算的b1p值:
嵌套循环版本
library(moments) # 参数设置 q0 <- 5 # 每次重复的行数 N0 <- 3 # 重复次数 # 初始化存储向量:长度为q0*N0的数值型向量 b1p_vec <- numeric(q0 * N0) for (rep in 1:N0) { # 计算当前重复段的起始/结束索引 start_pos <- (rep - 1) * q0 + 1 end_pos <- rep * q0 # 为当前重复的每一行计算独立的b1p for (row in 1:q0) { # 生成q0维的独立随机样本(样本量可自行调整) sample_data <- matrix(rnorm(q0 * 20), ncol = q0) # 计算当前样本的Mardia's b1p统计量 b1p_val <- mardia(sample_data)$b1p # 赋值到向量对应位置 b1p_vec[start_pos + row - 1] <- b1p_val } } # 转换成q0行N0列的矩阵,方便查看结构 b1p_matrix <- matrix(b1p_vec, nrow = q0, ncol = N0) print(b1p_matrix)
向量化简化版本(推荐)
用purrr包实现向量化操作,代码更简洁高效:
library(moments) library(purrr) q0 <- 5 N0 <- 3 # 一次性生成所有独立的b1p值 b1p_vec <- map_dbl(1:(q0*N0), ~{ # 每次生成独立的q0维样本 sample_data <- matrix(rnorm(q0 * 20), ncol = q0) mardia(sample_data)$b1p }) # 转换为目标结构 b1p_matrix <- matrix(b1p_vec, nrow = q0, ncol = N0) print(b1p_matrix)
关键修正点
- 独立样本生成:每一行对应一个独立的样本集,从根源保证b1p值互不相同
- 索引精准控制:通过计算起始/结束位置,避免赋值时的覆盖或越界问题
- 正确初始化:用
numeric()创建初始向量,确保未赋值位置不会保留NA(若需要初始NA,可替换为rep(NA, q0*N0))
内容的提问来源于stack exchange,提问作者hamna ehsan
相关产品推荐
相关产品推荐

