You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行产出导向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维度不匹配:
    1. 原代码中for (j in 1:N)后未加大括号,仅执行f.rhs = ...一行,最终f.rhs仅保留最后一个决策单元(DMU)的输入值,无法为每个DMU单独构建约束。
    2. 约束矩阵构建逻辑错误:空循环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)

关键修正点说明

  1. 循环结构修复:将每个DMU的求解逻辑完整包裹在for (j in 1:N)的大括号内,确保每个DMU单独构建约束并求解。
  2. 变量初始化:提前初始化weights、lambdas等结果存储变量,避免引用内置函数导致的类型错误。
  3. 约束逻辑修正:严格按照产出导向DEA的数学模型构建约束矩阵、方向和右端项,确保维度匹配,修正输入/输出约束的系数逻辑。

内容的提问来源于stack exchange,提问作者Atul Anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:35:22