これは私のコードです:
#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")
ここで、打ち切りは、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 x 2行列であり、b [1:2]は2 x 1のベクトルなので、何が悪いのでしょうか両方と初期値のベクトルを転置してみましたが、何も機能しません。誰も私を助けることができますか?
私は今日、同様の問題に遭遇しました(「順応性のない引数」エラー、すべてがうまく見えたとしても)、私の場合の解決策は、行列乗算の基本的なルールでした:すなわちcolumnsleft行列のrowsの数rightと同じでなければなりません行列=乗算方程式の順序を切り替える必要がありました。つまり、行列乗算では(通常の乗算とは異なり)A %*% B
はB %*% A
と同じではありません。