Rのエラー: nonconformable arguments.適合しない?

これが私のコードです。

    #define likelihood function (including an intercept/constant in the function.)
lltobit <- function(b,x,y) {
  sigma <-  b[3]
  y  <- as.matrix(y)
  x <- as.matrix(x)
  vecones <- rep(1,nrow(x)) 
  x <- cbind(vecones,x)
  bx <- x %*% b[1:2] 
  d <- y != 0 
  llik <- sum(d * ((-1/2)*(log(2*pi) + log(sigma^2) + ((y - bx)/sigma)^2)) 
              + (1-d) * (log(1 - pnorm(bx/sigma))))
  return(-llik)
}

n <- nrow(censored) #define number of variables 
y <- censored$y #define y and x for easier use
x1 <- as.matrix(censored$x)
x <-  cbind(rep(1,n),x1) #include constant/intercept 
bols <- (solve(t(x) %*% x)) %*% (t(x) %*% y) #compute ols estimator (XX) -1 XY
init <- rbind(as.matrix(bols[1:nrow(bols)]),1) #initial values 

init

tobit1 <- optim(init, lltobit, x=x, y=y, hessian=TRUE, method="BFGS")

ここで、censored は私のデータテーブルで、y の 200 個の (打ち切り) 値と x の 200 個の値を含んでいます。

すべてうまくいくのですが、optimコマンドを実行すると、次のようなエラーが発生します。

tobit1 <- optim(init, lltobit, x=x, y=y, hessian=TRUE, method="BFGS")
Error in x %*% b[1:2] : non-conformable arguments

意味はわかるのですが、xは200×2の行列、b[1:2]は2×1のベクトルなので、何が問題なのでしょうか?両方とも転置してみたり、初期値のベクトルも試してみましたが、何もうまくいきません。どなたか教えてください。

今日、同じような問題に出くわしたのですが("non-conformable arguments"エラー、すべて問題ないように見えたのに)、私の場合の解決策は、行列乗法の基本ルールにありました:つまり、行列の列数は、行列の*行数と同じでなければなりません=乗法の式で順番を入れ替える必要があったのです。 つまり、行列の乗算では(普通の乗算と違って)、`A %% BB %*% A`は同じではないのです。

解説 (0)