R使用coga包计算伽马分布比值方差时出现替换长度不匹配警告
R语言coga库计算伽马分布和比值方差时警告的原因及解决方法
警告产生原因
核心逻辑是:R中赋值语句左边接收位置的长度和右边待赋值内容的长度不匹配,R会强制截断/循环补全内容,因此抛出该警告。对应代码中的具体问题点:
- 二维数组索引错误:你定义的
y2_sp、y2_ph均为5行36列的二维数组,赋值时写y2_sp[i]仅代表取数组第i个一维位置(长度为1),但右侧2*array_2D[,2]*(b_sp[i]/b_ph[i])是长度大于1的向量,单个位置无法容纳多值。 - 数组维度定义不符合实际存储需求:
- 你调用
rcoga(n=1000,...)会返回长度为1000的随机数向量,但y3、y4定义为5行36列,仅用y3[i]赋值时接收位置长度为1,无法容纳1000个值。 - 你定义
pdf为长度5的一维数组,但dcoga(grid,...)返回的是和grid等长的36000个密度值,单个位置无法容纳36000个值。
- 你调用
- 变量覆盖问题:你先定义
y1为5行36列的二维数组,后续又执行y1 <- ((array_2D[,1])+1)/2,直接将y1覆盖为一维向量,后续索引逻辑容易出现偏差。
解决方法
按如下规则修改代码即可消除警告:
- 修正二维数组索引:给二维数组的某一行赋值时,需要加逗号指定列范围为所有列,示例:
# 原错误写法 y2_sp[i] <- 2*array_2D[,2]*(b_sp[i]/b_ph[i]) # 修正后写法 y2_sp[i,] <- 2*array_2D[,2]*(b_sp[i]/b_ph[i])
同理修改y2_ph[i]为y2_ph[i,]。
2. 调整数组维度匹配存储需求:
# y4需要存储5组、每组1000个随机数,维度改为5行1000列 y4 <- array(0, dim=c(5,1000)) # pdf需要存储5组、每组36000个密度值,维度改为5行36000列 pdf <- array(0, dim=c(5,36000)) # 赋值时指定整行接收 for (i in 1:5) { y4[i,] <- as.double(unlist(mapply(rcoga, 1000, y1[i], y2_sp[i,]) / mapply(rcoga, 1000, y1[i], y2_ph[i,]))) pdf[i,] <- mapply(dcoga, grid, shape=y1[i], rate= y2_sp[i,]) / mapply(dcoga, grid, shape=y1[i], rate= y2_ph[i,]) }
- 冗余变量可删除:
y3、提前定义后又被覆盖的y1/y2初始定义可以直接删除,避免逻辑混乱。 - 已解决的print问题写法参考:
print(paste0('var(y4) = ', var(y4[i,])))
内容的提问来源于stack exchange,提问作者user1773603
相关产品推荐
相关产品推荐

