【发布时间】:2017-11-26 12:02:25
【问题描述】:
我需要在不使用glm 的情况下手动编写概率回归模型。我会使用optim 直接最小化负对数似然。
我在下面写了代码,但它不起作用,报错:
无法将“闭包”类型强制转换为“双”类型的向量
# load data: data provided via the bottom link
Datospregunta2a <- read.dta("problema2_1.dta")
attach(Datospregunta2a)
# model matrix `X` and response `Y`
X <- cbind(1, associate_professor, full_professor, emeritus_professor, other_rank)
Y <- volunteer
# number of regression coefficients
K <- ncol(X)
# initial guess on coefficients
vi <- lm(volunteer ~ associate_professor, full_professor, emeritus_professor, other_rank)$coefficients
# negative log-likelihood
probit.nll <- function (beta) {
exb <- exp(X%*%beta)
prob<- rnorm(exb)
logexb <- log(prob)
y0 <- (1-y)
logexb0 <- log(1-prob)
yt <- t(y)
y0t <- t(y0)
-sum(yt%*%logexb + y0t%*%logexb0)
}
# gradient
probit.gr <- function (beta) {
grad <- numeric(K)
exb <- exp(X%*%beta)
prob <- rnorm(exb)
for (k in 1:K) grad[k] <- sum(X[,k]*(y - prob))
return(-grad)
}
# direct minimization
fit <- optim(vi, probit.nll, gr = probit.gr, method = "BFGS", hessian = TRUE)
数据:https://drive.google.com/file/d/0B06Id6VJyeb5OTFjbHVHUE42THc/view?usp=sharing
【问题讨论】:
-
一看到
read.dta("problema2_1.dta")我就怀疑你急需阅读minimal reproducible example -
感谢 cmets,我是一个使用 r 的菜鸟,我使用了 pnorm,将 y 更改为 Y 并添加“+”,程序运行了!
标签: r optimization regression logistic-regression glm