r - match.names(clabs, nmi) 中的错误 - 线性规划模型 - R

标签 r error-handling linear-programming rbind

我正在应用 CCR 数据包络分析模型来对股票数据进行基准测试。为此,我正在运行 DEA 论文 here 中的 R 代码。 。本文档附带有关如何在 R 中实现以下模型的分步说明。

数学公式如下:

enter image description here

找到我需要的已经为我制作的模型似乎好得令人难以置信。运行时出现此错误:

Error in match.names(clabs, nmi) : names do not match previous names

回溯:

4 stop("names do not match previous names") 
3 match.names(clabs, nmi) 
2 rbind(deparse.level, ...) 
1 rbind(aux, c(inputs[i, ], rep(0, m))) 

我的测试数据如下:

> dput(testdfst)
structure(list(Name = structure(1:10, .Label = c("Stock1", "Stock2", 
"Stock3", "Stock4", "Stock5", "Stock6", "Stock7", "Stock8", "Stock9", 
"Stock10"), class = "factor"), Date = structure(c(14917, 14917, 
14917, 14917, 14917, 14917, 14917, 14917, 14917, 14917), class = "Date"), 
    `(Intercept)` = c(0.454991569278089, 1, 0, 0.459437188169979, 
    0.520523252955415, 0.827294243132907, 0.642696631099892, 
    0.166219881886161, 0.086341470900152, 0.882092217743293), 
    rmrf = c(0.373075150411683, 0.0349067218712968, 0.895550280607866, 
    1, 0.180151549474574, 0.28669170468735, 0.0939821798173586, 
    0, 0.269645291515763, 0.0900619760898984), smb = c(0.764987877309785, 
    0.509094491489323, 0.933653313048327, 0.355340700554647, 
    0.654000372286503, 1, 0, 0.221454091364611, 0.660571586102851, 
    0.545086931342479), hml = c(0.100608151187926, 0.155064872867367, 
    1, 0.464298576152336, 0.110803875258027, 0.0720803195598597, 
    0, 0.132407005239869, 0.059742053684015, 0.0661623383303703
    ), rmw = c(0.544512524466665, 0.0761995312858816, 1, 0, 0.507699534880555, 
    0.590607506295898, 0.460148690870041, 0.451871218073951, 
    0.801698199214685, 0.429094840372901), cma = c(0.671162426988512, 
    0.658898571758625, 0, 0.695830176886926, 0.567814542084284, 
    0.942862571603074, 1, 0.37571611336359, 0.72565234813082, 
    0.636762557753099), Returns = c(0.601347600017365, 0.806071701848376, 
    0.187500487065719, 0.602971876359073, 0.470386289298666, 
    0.655773224143057, 0.414258177255333, 0, 0.266112191477882, 
    1)), .Names = c("Name", "Date", "(Intercept)", "rmrf", "smb", 
"hml", "rmw", "cma", "Returns"), row.names = c("Stock1.2010-11-04", 
"Stock2.2010-11-04", "Stock3.2010-11-04", "Stock4.2010-11-04", 
"Stock5.2010-11-04", "Stock6.2010-11-04", "Stock7.2010-11-04", 
"Stock8.2010-11-04", "Stock9.2010-11-04", "Stock10.2010-11-04"
), class = "data.frame")

线性模型程序是这样的:

namesDMU <- testdfst[1]
inputs <- testdfst[c(4,5,6,7,8)]
outputs <- testdfst[9]

N <- dim(testdfst)[1] # number of DMU
s <- dim(inputs)[2] # number of inputs
m <- dim(outputs)[2] # number of outputs

f.rhs <- c(rep(0,N),1) # RHS constraints
f.dir <- c(rep("<=",N),"=") # directions of the constraints
aux <- cbind(-1*inputs,outputs) # matrix of constraint coefficients in (6)
for (i in 1:N) {
  f.obj <- c(0*rep(1,s),outputs[i,]) # objective function coefficients
  f.con <- rbind(aux ,c(inputs[i,], rep(0,m))) # add LHS of bTz=1
  results <-lp("max",f.obj,f.con,f.dir,f.rhs,scale=1,compute.sens=TRUE) # solve LPP
  multipliers <- results$solution # input and output weights
  efficiency <- results$objval # efficiency score
  duals <- results$duals # shadow prices
  if (i==1) {
    weights <- multipliers
    effcrs <- efficiency
    lambdas <- duals [seq(1,N)]
  } else {
    weights <- rbind(weights,multipliers)
    effcrs <- rbind(effcrs , efficiency)
    lambdas <- rbind(lambdas,duals[seq(1,N)])
  }
}

发现问题..

快速搜索显示 rbind功能可能有问题。它位于这一行:

f.con <- rbind(aux ,c(inputs[i,], rep(0,m))) 

我尝试将数据与循环隔离以查看问题所在:

aux <- cbind(-1*inputs,outputs)
a <- c(inputs[1,])
b <- rep(0,m)

> aux
          rmrf        smb         hml         rmw        cma   Returns
1  -0.37307515 -0.7649879 -0.10060815 -0.54451252 -0.6711624 0.6013476
2  -0.03490672 -0.5090945 -0.15506487 -0.07619953 -0.6588986 0.8060717
3  -0.89555028 -0.9336533 -1.00000000 -1.00000000  0.0000000 0.1875005
4  -1.00000000 -0.3553407 -0.46429858  0.00000000 -0.6958302 0.6029719
5  -0.18015155 -0.6540004 -0.11080388 -0.50769953 -0.5678145 0.4703863
6  -0.28669170 -1.0000000 -0.07208032 -0.59060751 -0.9428626 0.6557732
7  -0.09398218  0.0000000  0.00000000 -0.46014869 -1.0000000 0.4142582
8   0.00000000 -0.2214541 -0.13240701 -0.45187122 -0.3757161 0.0000000
9  -0.26964529 -0.6605716 -0.05974205 -0.80169820 -0.7256523 0.2661122
10 -0.09006198 -0.5450869 -0.06616234 -0.42909484 -0.6367626 1.0000000

> a
$rmrf
[1] 0.3730752

$smb
[1] 0.7649879

$hml
[1] 0.1006082

$rmw
[1] 0.5445125

$cma
[1] 0.6711624

我也看过这个:

> identical(names(aux[1]), names(a[1]))
[1] TRUE

只要计算问题,列名和行名对我来说并不重要,因此我决定尝试删除它们。这个可以工作,但不能解决问题。

rownames(testdfst) <- NULL

查看 a 的内容和aux ,也许问题出在列名上。

colnames(testdfst) <- NULL不起作用。它删除了我的数据框中的所有内容。如果我能弄清楚如何删除列名,它也许可以提供问题的解决方案。

最佳答案

正如您正确识别的那样,以下行给您带来了麻烦:

i <- 1
f.con <- rbind(aux ,c(inputs[i,], rep(0,m))) # add LHS of bTz=1
# Error in match.names(clabs, nmi) : names do not match previous names

您可以使用str函数查看该表达式每个元素的结构:

str(aux)
# 'data.frame': 10 obs. of  6 variables:
#  $ rmrf   : num  -0.3731 -0.0349 -0.8956 -1 -0.1802 ...
#  $ smb    : num  -0.765 -0.509 -0.934 -0.355 -0.654 ...
#  $ hml    : num  -0.101 -0.155 -1 -0.464 -0.111 ...
#  $ rmw    : num  -0.5445 -0.0762 -1 0 -0.5077 ...
#  $ cma    : num  -0.671 -0.659 0 -0.696 -0.568 ...
#  $ Returns: num  0.601 0.806 0.188 0.603 0.47 ...

str(inputs[i,])
# 'data.frame': 1 obs. of  5 variables:
#  $ rmrf: num 0.373
#  $ smb : num 0.765
#  $ hml : num 0.101
#  $ rmw : num 0.545
#  $ cma : num 0.671

str(c(inputs[i,], rep(0, m)))
# List of 6
#  $ rmrf: num 0.373
#  $ smb : num 0.765
#  $ hml : num 0.101
#  $ rmw : num 0.545
#  $ cma : num 0.671
#  $     : num 0

现在您可以看到您尝试与 rbind 组合的列表与其组合的数据框具有不同的名称。最简单的方法可能是传递一个向量作为新行而不是列表,您可以通过使用 as.matrix< 将 inputs[i,] 转换为矩阵来完成此操作:

str(c(as.matrix(inputs[i,]), rep(0, m)))
#  num [1:6] 0.373 0.765 0.101 0.545 0.671 ...

这将使代码正常工作而不会出现错误:

f.con <- rbind(aux, c(as.matrix(inputs[i,]), rep(0, m)))

一些未经请求的 R 编码技巧 - 而不是 dim(x)[1]dim(x)[2] 来获取行数和列数,大多数人会发现执行 nrow(x)ncol(x) 更具可读性。此外,通过每次 rbind 一行来在 for 循环中构建对象的效率可能非常低——您可以在 the R Inferno 的第二个圆圈中阅读更多相关信息。 .

关于r - match.names(clabs, nmi) 中的错误 - 线性规划模型 - R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32207787/

相关文章:

algorithm - 有条件的房间分配和调度任务——优化算法

r - 使用 Rcpp 的斐波那契数列的意外结果

wcf - 是否可以配置WCF服务客户端以引发自定义FaultException?

jquery - 防止未处理的 jQuery AJAX 错误

c++ - 创建 IloObjective 的正确方法

python-3.x - 如何在 Numpy/MatplotLib 中可视化线性规划(具有任意不等式)的可行区域?

将三列数据框 reshape 为矩阵 ("long"到 "wide"格式)

r - 带有最小和最大标签的漂亮轴

r - ggplot2:绘制具有不同截距但具有相同斜率的回归线

excel - 生成与行值相对应的图纸(存在重复值)