从 clogitLasso() 模型中获取预测?
Get predictions from clogitLasso() model?
我如何从 clogitLasso model
获得预测结果?
它会给我一系列惩罚权重,以及与之相关的协变量系数,但我接下来要做的是选择其中一个权重并使用相关模型进行预测。然后我可以使用 AUC
或类似的方法评估模型。
也欢迎使用其他库的建议。
(也有可能被退回 CrossValidated,但这并不是一个真正的理论问题。。。)
clogitLasso()
没有 predict()
函数,但我想多了。你可以自己做数据与系数的矩阵乘法。
例如:
首先我们将模拟一些数据。 360 次观察,180 case/control 对。 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 将系数转换回 "original scale",这在这里没用。)
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 个,因为。
然后我们将原始输入数据乘以系数 ("betas") 以尝试预测原始结果——case
:
的值
handMadePredictions <- as.matrix(mm[, c("e1", "x1")]) %*% model$beta[10, ]
这是线性预测器,我们需要将其转换回概率尺度进行预测:
logistic <- function(logOdds) {
return(exp(logOdds) / (exp(logOdds) + 1))
}
handMadePredictions <- logistic(handMadePredictions)
原始数据 - case
- 是一系列交替的 1 和 0。我们可以看到,该模型根据原始输入很好地预测了这些结果。通过检查 round(handMadePredictions)
或使用混淆矩阵:
table("predicted"=round(handMadePredictions), "Case/control"=mm$case)
Case/control
predicted 0 1
0 172 12
1 8 168
注意在这个玩具示例中没有阶层效应——x1
和[=18之间的关联=] 是相同的,无论数据点在 set
中。在这种简化的情况下,不需要条件逻辑回归,常规逻辑回归就可以正常工作。但是当存在层效应时,我无法从 clogitLasso()
得到合理的预测结果,这是另一个问题。
我如何从 clogitLasso model
获得预测结果?
它会给我一系列惩罚权重,以及与之相关的协变量系数,但我接下来要做的是选择其中一个权重并使用相关模型进行预测。然后我可以使用 AUC
或类似的方法评估模型。
也欢迎使用其他库的建议。
(也有可能被退回 CrossValidated,但这并不是一个真正的理论问题。。。)
clogitLasso()
没有 predict()
函数,但我想多了。你可以自己做数据与系数的矩阵乘法。
例如:
首先我们将模拟一些数据。 360 次观察,180 case/control 对。 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 将系数转换回 "original scale",这在这里没用。)
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 个,因为。
然后我们将原始输入数据乘以系数 ("betas") 以尝试预测原始结果——case
:
handMadePredictions <- as.matrix(mm[, c("e1", "x1")]) %*% model$beta[10, ]
这是线性预测器,我们需要将其转换回概率尺度进行预测:
logistic <- function(logOdds) {
return(exp(logOdds) / (exp(logOdds) + 1))
}
handMadePredictions <- logistic(handMadePredictions)
原始数据 - case
- 是一系列交替的 1 和 0。我们可以看到,该模型根据原始输入很好地预测了这些结果。通过检查 round(handMadePredictions)
或使用混淆矩阵:
table("predicted"=round(handMadePredictions), "Case/control"=mm$case)
Case/control
predicted 0 1
0 172 12
1 8 168
注意在这个玩具示例中没有阶层效应——x1
和[=18之间的关联=] 是相同的,无论数据点在 set
中。在这种简化的情况下,不需要条件逻辑回归,常规逻辑回归就可以正常工作。但是当存在层效应时,我无法从 clogitLasso()
得到合理的预测结果,这是另一个问题。