这个错误是由于在计算因子贡献率时,代码中的索引超出了矩阵的范围。具体来说,你在计算贡献率时使用了一个2行4列的矩阵x,但是在循环时使用了i从1到2,j从1到4的循环,这样会导致在第二次循环时会出现索引超出范围的错误。为了解决这个问题,你可以修改循环的范围,使其与矩阵的维度匹配。具体来说,你可以将循环的范围修改为i从1到nrow(x),j从1到ncol(x)。修改后的代码如下所示:

LMDI_contrib <- function(y, x){
  n <- length(y)
  m <- length(x)
  
  # 初始化因子贡献率矩阵
  contrib <- matrix(0, nrow = m, ncol = n)
  
  # 计算因子贡献率
  for(i in 1:nrow(x)){
    for(j in 1:ncol(x)){
      if(i == 1){
        contrib[i, j] <- log(y[j]/y[1])
      }else{
        contrib[i, j] <- log(x[i, j]/x[i, 1]) - log(x[i-1, j]/x[i-1, 1])
      }
    }
  }
  
  # 返回因子贡献率矩阵
  return(contrib)
}

# 示例数据
y <- c(100, 120, 150, 180)  # 总体指标
x1 <- c(50, 60, 80, 90)  # 因子1
x2 <- c(30, 40, 60, 70)  # 因子2

# 构建因子矩阵
x <- matrix(c(x1, x2), nrow = 2, byrow = TRUE)

# 计算因子贡献率
contrib <- LMDI_contrib(y, x)

现在应该可以正确计算因子贡献率了。

# 定义函数计算LMDI因子贡献率 LMDI_contrib - functiony x+ n - lengthy+ m - lengthx+ + # 初始化因子贡献率矩阵+ contrib - matrix0 nrow = m ncol = n+ + # 计算因子贡献率+ fori in 1m+ forj in 1n+ ifi == 1+

原文地址: https://www.cveoy.top/t/topic/jd0d 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录