对于我的论文,我必须使用一些R所没有的MLE来拟合glm模型,我可以使用紧密形式的模型,但是现在我必须使用de Gausian CDF,所以我决定适合一个简单的probit模型。 这是代码:
Data:
set.seed(123)
x <-matrix( rnorm(50,2,4),50,1)
m <- matrix(runif(50,2,4),50,1)
t <- matrix(rpois(50,0.5),50,1)
z <- (1+exp(-((x-mean(x)/sd(x)))))^-1 + runif(50)
y <- ifelse(z < 1.186228, 0, 1)
data1 <- as.data.frame(cbind(y,x,m,t))
myprobit <- function (formula, data)
{
mf <- model.frame(formula, data)
y <- model.response(mf, "numeric")
X <- model.matrix(formula, data = data)
if (any(is.na(cbind(y, X))))
stop("Some data are missing.")
loglik <- function(betas, X, y, sigma) { #loglikelihood
p <- length(betas)
beta <- betas[-p]
eta <- X %*% beta
sigma <- 1 #because of identification, sigma must be equal to 1
G <- pnorm(y, mean = eta,sd=sigma)
sum( y*log(G) + (1-y)*log(1-G))
}
ls.reg <- lm(y ~ X - 1)#starting values using ols, indicating that this model already has a constant
start <- coef(ls.reg)
fit <- optim(start, loglik, X = X, y = y, control = list(fnscale = -1), method = "BFGS", hessian = TRUE) #optimizar
if (fit$convergence > 0) {
print(fit)
stop("optim failed to converge!") #verify convergence
}
return(fit)
}
myprobit(y ~ x + m + t,data = data1)
然后我得到:Error in X %*% beta : non-conformable arguments
,如果我将start <- coef(ls.reg)
更改为start <- c(coef(ls.reg), 1)
,则与以下情况相比我得到了错误的刺激:
probit <- glm(y ~ x + m + t,data = data1 , family = binomial(link = "probit"))
我做错了什么? 可以使用pnorm正确地拟合此模型,如果没有,我应该使用哪种算法来接近高斯CDF。谢谢!
答案 0 :(得分:0)
导致您的错误的代码行如下:
eta <- X %*% beta
请注意,“%*%”是矩阵乘法运算符。通过复制您的代码,我注意到X是具有50行4列的矩阵。因此,要使矩阵相乘成为可能,您的“ beta”需要有4行。但是,当您运行“ betas [-p]”时,您将通过删除其最后一个元素来对beta矢量进行子集化,只剩下三个元素,而不是定义矩阵乘法所需的四个元素。如果删除[-p],该代码将起作用。