match.names中的错误(clabs,nmi) - 线性编程模型 - R.

时间:2015-08-25 15:14:36

标签: r error-handling linear-programming rbind

我正在应用CCR数据包络分析模型来对库存数据进行基准测试。为此,我正在发布here发布的DEA论文中的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

查看aaux的内容,可能问题在于列名。

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

1 个答案:

答案 0 :(得分:1)

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

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合并的列表与其合并的数据框中的名称不同。可能最简单的方法是将矢量作为新行而不是列表传递,您可以通过将inputs[i,]转换为带as.matrix的矩阵来实现:

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)和{{1}更具可读性}}。此外,通过ncol(x)一次一行构建for循环中的对象效率非常低 - 您可以在the R Inferno的第二个循环中阅读更多相关信息。

相关问题