首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“x”作为至少两个维度的数组

“x”作为至少两个维度的数组
EN

Stack Overflow用户
提问于 2020-01-16 12:21:00
回答 1查看 127关注 0票数 2

对于R和RStudio以及整个编码语言的概念来说,都是非常新的。我正在尝试创建可复制的代码,这样我就可以正确地提出一个问题。

第一个错误是:

colSums中的错误(cTrain* log(pTrain) + cCar * log(pCar) + cSM * log(pSM)):'x‘必须是至少两个维度的数组

使用这段代码,我可以在哪里修复这个问题,以便“x”可以有两个维度?

代码语言:javascript
复制
mydata <- structure(list(LUGGAGE=c(0,1,0,1,0), GA=c(0,0,0,0,0), TRAIN_AV=c(1,1,1,1,1), CAR_AV=c(1,1,1,1,1), SM_AV=c(1,1,1,1,1), 
               TRAIN_TT=c(114,142,235,193,227), TRAIN_CO=c(40,109,124,90,94),
               SM_TxT=c(44,91,179,119,108), SM_CO=c(46,132,132,127,118),
               CAR_TT=c(140,110,170,150,286), CAR_CO=c(123,104,80,95,169), CHOICE=c(2,2,3,3,2)),
               .Names=c("Luggage","GA","TRAIN_AV","CAR_AV","SM_AV","TRAIN_TT","TRAIN_CO","SM_TT","SM_CO","CAR_TT","CAR_CO","CHOICE"), 
               row.names=c(NA,5L), class="data.frame")

## Initial value of parameters
initPar <- 8


### Log-Likelihood Function of the Logit Model
library("maxLik")
loglik <- function(x) {
  ## Parameters
  # Alternative Specific Constants
  asc_train   <- x[1]
  asc_sm      <- x[2]
  # Travel Time to Destination
  ttime       <- x[3]
  # Travel Cost to Destination
  tcost_train <- x[4]
  tcost_car   <- x[5]
  tcost_sm    <- x[6]
  # Effect of Swiss Annual Season Ticket
  ga <- x[7]
  # Effect of luggage
  luggage <- x[8]

  ## Log-Likelihood Variable
  LL = 0

  ## Utility Function Vin
  train  <- asc_train*matrix(1, nrow=nrow(mydata), ncol = 1) + tcost_train*mydata$TRAIN_CO + ttime*mydata$TRAIN_TT/100 + ga*mydata$GA + luggage*mydata$LUGGAGE
  car    <-                                                    tcost_car*mydata$CAR_CO     + ttime*mydata$CAR_TT/100                  + luggage*mydata$LUGGAGE
  sm     <- asc_sm*matrix(1, nrow=nrow(mydata), ncol = 1)    + tcost_sm*mydata$SM_CO       + ttime*mydata$SM_TT/100    + ga*mydata$GA + luggage*mydata$LUGGAGE

  ## exp(Vin) and Control for Mode Availability
  train  <- mydata$TRAIN_AV *exp(train)
  car    <- mydata$CAR_AV   *exp(car)
  sm     <- mydata$SM_AV    *exp(sm)

  ## Choice Probabilities
  deno   <- (train + car + sm)

  ## Individual Choice Probabilities
  pTrain <- mydata$TRAIN_AV *(train / deno)
  pCar   <- mydata$CAR_AV   *(car   / deno)
  pSM    <- mydata$SM_AV    *(sm    / deno)

  pTrain <- (pTrain!=0) *pTrain + (pTrain==0)
  pCar   <- (pCar!=0)   *pCar   + (pCar==0)
  pSM    <- (pSM!=0)    *pSM    + (pSM==0)

  ## Choice Results
  cTrain <- mydata$CHOICE == "1"
  cCar   <- mydata$CHOICE == "3"
  cSM    <- mydata$CHOICE == "2"

  ## Log-Likelihood Function
  LL <- colSums(cTrain*log(pTrain) + cCar*log(pCar) + cSM*log(pSM))
}


### Maximization of Log-Likelihood Function ###
# Parameter Optimization
result <- maxLik(loglik, start=numeric(initPar))

# Parameter Estimation, Hessian Matrix Calculation
parameters    <- result$estimate
hessianMatrix <- result$hessian

# T-Statistic Calculation
tval <- parameters/sqrt(-diag(solve(hessianMatrix)))

# L(0), Log-Likelihood When All parameters = 0
L0 <- loglik(numeric(initPar))
# LL, Maximumum Likelihood
LL <- result$maximum
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-16 12:46:02

用一个可重复的例子很好地提出了问题;

你的问题很简单。您的函数寻找一个不存在的名为mydata$LUGGAGE的变量。R区分大小写,您的列称为mydata$Luggage

你要做的就是

代码语言:javascript
复制
names(mydata)[1] <- "LUGGAGE"

现在运行您的脚本,您将得到以下结果:

代码语言:javascript
复制
result <- maxLik(loglik, start=numeric(initPar))
result
# Maximum Likelihood estimation
# Newton-Raphson maximisation, 30 iterations
# Return code 2: successive function values within tolerance limit
# Log-Likelihood: -1.744552e-07 (8 free parameter(s))
# Estimate(s): -277.7676 -250.6531 8.651811 -1.680196 -4.208955 -1.281697 0 354.4692
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59769610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档