'X' как массив из двух измерений - PullRequest
2 голосов
/ 16 января 2020

Очень новый для R и RStudio и всей концепции языка кодирования. Я пытаюсь создать воспроизводимый код, чтобы я мог правильно задать вопрос.

Первая ошибка говорит:

Ошибка в colSums (cTrain * log (pTrain) + cCar * log (pCar) + cSM * log (pSM)): 'x' must быть массивом по крайней мере двух измерений

Используя этот код, где я могу исправить это, чтобы 'x' мог иметь два измерения?

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

1 Ответ

1 голос
/ 16 января 2020

Красиво заданный вопрос с воспроизводимым примером; upvoted!

Ваша проблема была очень простой. Ваша функция ищет переменную с именем mydata$LUGGAGE, которая не существует. R чувствителен к регистру, и ваш столбец называется mydata$Luggage.

Все, что вам нужно сделать, это

names(mydata)[1] <- "LUGGAGE"

Теперь запустите ваш скрипт, и вы должны получить такой результат:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...