# 定义函数计算LMDI因子贡献率 LMDI_contrib - functiony x+ n - lengthy+ m - lengthx+ + # 初始化因子贡献率矩阵+ contrib - matrix0 nrow = m ncol = n+ + # 计算因子贡献率+ fori in 1m+ forj in 1n+ ifi == 1+
这个错误是由于在计算因子贡献率时,代码中的索引超出了矩阵的范围。具体来说,你在计算贡献率时使用了一个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)
现在应该可以正确计算因子贡献率了。
原文地址: https://www.cveoy.top/t/topic/jd0d 著作权归作者所有。请勿转载和采集!