运行产出导向DEA模型时遭遇向量长度与类型错误求助
产出导向DEA模型运行错误排查与修复
出现的错误信息
1. 警告信息
Warning message: In rbind(const.mat, const.dir.num, const.rhs) : number of columns of result is not a multiple of vector length (arg 2)
2. 报错信息
Error in rbind(weights, results$solution[1]) : cannot coerce type 'closure' to vector of type 'list'
错误原因分析
第一个警告的原因
- 约束矩阵
f.con、约束方向f.dir和右端项f.rhs维度不匹配:- 原代码中
for (j in 1:N)后未加大括号,仅执行f.rhs = ...一行,最终f.rhs仅保留最后一个决策单元(DMU)的输入值,无法为每个DMU单独构建约束。 - 约束矩阵构建逻辑错误:空循环
for(i in 1:m){}后单独执行赋值语句,仅会对第m行输入约束赋值;输出约束循环错误使用j变量,导致所有输出约束都指向最后一个DMU的产出值。
- 原代码中
第二个错误的原因
- 结果存储变量未提前初始化:原代码中
weights仅在j==1时定义,但由于前面的for循环未加括号,j最终取值为N,直接进入else分支,此时weights是R内置函数(closure类型),无法与数值型的results$solution[1]执行rbind操作,触发类型不匹配错误。
修正后的完整代码
library(readxl) library(lpSolve) library(rJava) library(WriteXLS) library(xlsxjars) # 读取数据集 df <- data.frame(read_excel(path = "Data1.xlsx", sheet = "1")) inputs <- df[, 1:2] # 提取输入变量 outputs <- df[, 3:4] # 提取输出变量 m <- ncol(inputs) # 输入变量数量 s <- ncol(outputs) # 输出变量数量 N <- nrow(df) # 决策单元数量 # 初始化结果存储变量 weights <- numeric(N) lambdas <- matrix(nrow = N, ncol = N) xbench <- matrix(nrow = N, ncol = m) ybench <- matrix(nrow = N, ncol = s) # 遍历每个决策单元求解DEA模型 for (j in 1:N) { # 构建目标函数:产出导向,最大化theta(第一个变量) f.obj <- c(1, rep(0, N)) # 构建约束矩阵:m个输入约束 + s个输出约束 + 1个凸性约束 f.con <- matrix(0, nrow = m + s + 1, ncol = N + 1) # 输入约束:theta*x_j >= sum(lambda_i*x_i) → 转换为 -sum(lambda_i*x_i) + theta*x_j >= 0 for (i in 1:m) { f.con[i, 1] <- df[j, i] # theta的系数为第j个DMU的第i个输入值 f.con[i, 2:(N+1)] <- -df[, i] # lambda的系数为负的所有DMU的第i个输入值 } # 输出约束:sum(lambda_i*y_i) >= theta*y_j → sum(lambda_i*y_i) - theta*y_j >= 0 for (r in 1:s) { f.con[m + r, 1] <- -df[j, m + r] # theta的系数为负的第j个DMU的第r个输出值 f.con[m + r, 2:(N+1)] <- df[, m + r] # lambda的系数为所有DMU的第r个输出值 } # 凸性约束:sum(lambda_i) = 1 f.con[m + s + 1, 2:(N+1)] <- rep(1, N) # 约束方向:输入约束<=,输出约束>=,凸性约束= f.dir <- c(rep("<=", m), rep(">=", s), "=") # 约束右端项:输入约束为0,输出约束为0,凸性约束为1 f.rhs <- c(rep(0, m), rep(0, s), 1) # 求解线性规划 results <- lp("max", f.obj, f.con, f.dir, f.rhs, scale = 0, compute.sens = F) # 存储结果 weights[j] <- results$solution[1] lambdas[j, ] <- results$solution[2:(N+1)] xbench[j, ] <- lambdas[j, ] %*% as.matrix(inputs) ybench[j, ] <- lambdas[j, ] %*% as.matrix(outputs) } # 查看结果 print(weights) print(lambdas)
关键修正点说明
- 循环结构修复:将每个DMU的求解逻辑完整包裹在
for (j in 1:N)的大括号内,确保每个DMU单独构建约束并求解。 - 变量初始化:提前初始化
weights、lambdas等结果存储变量,避免引用内置函数导致的类型错误。 - 约束逻辑修正:严格按照产出导向DEA的数学模型构建约束矩阵、方向和右端项,确保维度匹配,修正输入/输出约束的系数逻辑。
内容的提问来源于stack exchange,提问作者Atul Anand
相关产品推荐
相关产品推荐

