这是我的代码:
#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")
Run Code Online (Sandbox Code Playgroud)
审查的是我的数据表,包括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
Run Code Online (Sandbox Code Playgroud)
我知道这是什么意思,但由于x是200乘2的矩阵,b [1:2]是2乘1的向量,出了什么问题?我尝试了转置两者,以及初始值向量,但没有任何作用.谁能帮我?
小智 7
我今天发现了类似的问题绊倒("非顺应性的参数"的错误,即使一切似乎都OK),并在我的情况的解决办法是在矩阵乘法基本规则:即数列中的左矩阵必须是相同的的数量的行的的权矩阵=我不得不在乘法方程切换顺序.换句话说,在矩阵乘法(与普通乘法不同)中,A %*% B不一样B %*% A.