Пуассоновская регрессия вручную
Я хочу сделать регрессию Пуассона вручную и определить функцию, которая может быть использована для оценки произвольного числа коэффициентов. У меня есть 2 вопроса:
Первое: как мне получить матрицу бета-версий, и мне не нужно писать каждую бета-версию. Я хочу написать лямбда таким образом, лямбда = exp(t(x)%*% бета) . Я думал, что могу сделать цикл for и создать для каждого столбца в бета-версии XA и суммировать их AB в матрице, но я не знаю, как его кодировать.
Второе: поскольку я не знаю, как писать для бета-версий, я попытался написать функцию для оценки 6-ти бета. Я получаю результат с деформациями набора данных, но коэффициенты не такие, как в GLM, почему? Я также не знаю, какие значения мне нужно вставить для сравнения, а также не знаю, почему optim не работает, если я не вставляю x и y в функцию.
Надеюсь, вы можете помочь!
daten <- warpbreaks
LogLike <- function(y,x, par) {
beta <- par
# the deterministic part of the model:
lambda <- exp(beta%*%t(x))
# and here comes the negative log-likelihood of the whole dataset, given the
# model:
LL <- -sum(dpois(y, lambda, log = TRUE))
return(LL)
}
PoisMod<-function(formula, data){
# #formula
form <- formula(formula)
#
# # dataFrame
model <- model.frame(formula, data = data)
#
# # Designmatrix
x <- model.matrix(formula,data = data)
#
# # Response Variable
y <- model.response(model)
par <- rep(0,ncol(x))
call <- match.call()
koef <- optim(par=par,fn=LogLike,x=x,y=y)$par
estimation <- return(list("coefficients" = koef,"call"= call))
class(result) <- "PoisMod"
}
print.PoisMod <- function(x, ...) {
# Call
cat("Call:", "\n")
#
print(x$call)
#
cat("\n")
# Coefficients
cat("Coefficents:", "\n")
#
Koef <- (t(x$coefficients))
#
rownames(Koef) <- ""
#
print(round(Koef, 3))
}
1 ответ
Вот рабочий пример, основанный на вашем коде.. но без квадрата объясняющих переменных:
LogLike <- function(y,x, par) {
beta0 <- par[1]
beta1 <- par[2]
beta2 <- par[3]
beta3 <- par[4]
# the deterministic part of the model:
lambda <- exp(beta0*x[,1] + beta1 * x[,2] +beta2*x[,3]+beta3*x[,4])
# and here comes the negative log-likelihood of the whole dataset, given the
# model:
LL <- -sum(dpois(y, lambda, log = TRUE))
return(LL)
}
PoisMod<-function(formula, data){
# # definiere Regressionsformel
form <- formula(formula)
#
# # dataFrame wird erzeugt
model <- model.frame(formula, data = data)
#
# # Designmatrix erzeugt
x <- model.matrix(formula,data = data)
#
# # Response Variable erzeugt
y <- model.response(model)
par <- c(0,0,0,0)
erg <- list(optim(par=par,fn=LogLike,x=x,y=y)$par)
return(erg)
}
PoisMod(breaks~wool+tension, as.data.frame(daten))
И вы можете сравнить с GLM:
glm(breaks~wool+tension, family = "poisson", data = as.data.frame(daten))
Изменить: для любого количества объясняющих переменных
LogLike <- function(y,x, par) {
beta <- par
# the deterministic part of the model:
lambda <- exp(beta%*%t(x))
# and here comes the negative log-likelihood of the whole dataset, given the
# model:
LL <- -sum(dpois(y, lambda, log = TRUE))
return(LL)
}
PoisMod<-function(formula, data){
# # definiere Regressionsformel
form <- formula(formula)
#
# # dataFrame wird erzeugt
model <- model.frame(formula, data = data)
#
# # Designmatrix erzeugt
x <- model.matrix(formula,data = data)
#
# # Response Variable erzeugt
y <- model.response(model)
par <- rep(0,ncol(x))
erg <- list(optim(par=par,fn=LogLike,x=x,y=y)$par)
return(erg)
}
PoisMod(breaks~wool+tension, as.data.frame(daten))
glm(breaks~wool+tension, family = "poisson", data = as.data.frame(daten))