Для clogitLasso()
нет функции predict()
, но я обдумывал это. Вы можете самостоятельно выполнить матричное умножение данных на коэффициенты.
Например:
Сначала мы смоделируем некоторые данные. 360 наблюдений, в 180 парах случай / контроль. case
кодируется 1/0, а set
нумерует 180 пар. Есть два ковариаты: e1
- шум, и x1
связан с результатом, case
.
library("clogitLasso")
set.seed(0)
N <- 360
mm <- data.frame(case=rep(c(1, 0), times=N/2))
mm$set <- rep(1:(N/2), each=2)
mm$e1 <- rnorm(n=N, mean=5, sd=10)
mm$x1 <- mm$case*10 + rnorm(n=N, mean=0, sd=3)
Чтобы получить прогнозы от clogitLasso, нам нужно самостоятельно нормализовать ковариаты (среднее = 0, sd = 1), прежде чем вводить данные в модель. (В противном случае clogitLasso переводит коэффициенты обратно в «исходный масштаб», который здесь бесполезен.)
mm[, c("e1", "x1")] <- scale(mm[, c("e1", "x1")], center=TRUE, scale=TRUE)
Затем постройте модель:
model <- clogitLasso(X=as.matrix(mm[, c("e1", "x1")]), y=as.matrix(mm$case),
strata=mm$set, standardize=FALSE)
Нам нужно выбрать, для какого значения веса штрафа мы хотим проверить прогнозы - здесь мы выберем 10-е, просто потому что.
И мы умножаем исходные входные данные на коэффициенты («бета»), чтобы попытаться предсказать исходные результаты - значение case
:
handMadePredictions <- as.matrix(mm[, c("e1", "x1")]) %*% model$beta[10, ]
Это линейный предиктор, который нам нужно преобразовать обратно в шкалу вероятностей для предсказания:
logistic <- function(logOdds) {
return(exp(logOdds) / (exp(logOdds) + 1))
}
handMadePredictions <- logistic(handMadePredictions)
Исходные данные - case
- представляли собой серию чередующихся единиц и нулей. Мы можем видеть, что эта модель достаточно хорошо предсказывала эти результаты, исходя из исходных данных. Либо путем проверки round(handMadePredictions)
, либо с помощью матрицы путаницы:
table("predicted"=round(handMadePredictions), "Case/control"=mm$case)
Case/control
predicted 0 1
0 172 12
1 8 168
Обратите внимание , что в этом примере с игрушкой нет эффектов страты - связь между x1
и case
одинакова, независимо от того, какие set
точки данных В этой упрощенной ситуации нет необходимости в условной логистической регрессии, обычная логистическая регрессия будет работать просто отлично. Но я не смог получить правдоподобных результатов предсказания от clogitLasso()
, когда есть эффекты пласта, а это совсем другой вопрос.