R语言仅当A>B时计算Bootstrap百分比差异的代码问题咨询
代码问题原因
- 判断逻辑错误:原代码在抽样前判断原始向量
A > B,R中向量逐元素比较会返回逻辑向量,if语句仅读取第一个元素的布尔值,无法判断抽样结果的大小关系 - 抽样参数错误:
sample()未指定size参数,默认抽取和原向量等长的10个样本,计算得到的长度为10的差异向量赋值给单个元素位置时仅会保留第一个值 - 初始化逻辑问题:
Per_Dif默认初始值为0,未满足计算条件的迭代不会修改对应位置值,最终结果会留存大量无意义的初始0值
修正后代码
如果需要每次独立从A、B中各抽1个样本,仅当A样本值大于B样本值时计算百分比差异,符合条件的结果存入向量,未符合条件的不保留,代码如下:
A <- c(13,5,8,1,23,4,7,2,14,27) B <- c(5,7,0.5,10, 1,3, 0.7,2,0.8,4) percentage_difference <- function(value, value_two) { (value - value_two) / value } n <- 10000 Per_Dif <- c() # 初始化空向量,仅存入符合条件的结果 for (i in 1:n) { # 先各抽1个样本 sample_a <- sample(A, size = 1, replace = T) sample_b <- sample(B, size = 1, replace = T) # 再判断抽样值大小 if(sample_a > sample_b){ Per_Dif <- c(Per_Dif, percentage_difference(sample_a, sample_b)) } }
如果需要配对抽样(每次抽取相同的索引,取A、B对应位置的数值配对),仅当配对的A值大于B值时计算差异,调整循环内的抽样逻辑即可:
for (i in 1:n) { # 抽取索引,对应取A、B的配对值 sample_idx <- sample(1:length(A), size = 1, replace = T) sample_a <- A[sample_idx] sample_b <- B[sample_idx] if(sample_a > sample_b){ Per_Dif <- c(Per_Dif, percentage_difference(sample_a, sample_b)) } }
如果需要保持结果长度和迭代次数一致,不符合条件的位置标记为缺失值,可将初始化改为Per_Dif <- rep(NA, n),不满足判断条件时为Per_Dif[i]赋值NA即可。
内容的提问来源于stack exchange,提问作者SM87
相关产品推荐
相关产品推荐

