我正在使用一个名为logistf的R包来进行逻辑回归分析,发现这个包没有用于新数据的预测函数,而且predict包与之不兼容,所以我找到了一段代码,展示了如何对新数据进行预测:
fit<-logistf(Tax ~ L20+L24+L28+L29+L31+L32+L33+L36+S10+S15+S16+S17+S20, data=trainData) betas <- coef(fit)X <- model.matrix(fit, data=testData)probs <- 1 / (1 + exp(-X %*% betas))
我想使用fit$predict和probs生成的概率来创建一个交叉验证版本。是否有人之前做过类似的事情?
另外我想了解fit$predict,我正在进行二元逻辑回归,这个函数返回了多个值,这些值是属于类别0还是1?我如何判断这一点?谢谢
回答:
虽然你写的代码运行得很完美,但似乎有种更简洁的方法可以得到相同的结果:
brglm_model <- brglm(formula = response ~ predictor , family = "binomial", data = train )brglm_pred <- predict(object = brglm_model, newdata = test , type = "response")
关于交叉验证,我想你需要写几行代码:
#设置折数和每折的实例数n_folds <- 5 fold_size <- nrow(dataset) %/% 5 residual <- nrow(dataset) %% 5#根据折数标记实例cv_labels <- c(rep(1,fold_size),rep(2,fold_size), rep(3,fold_size), rep(4,fold_size), rep(5,fold_size), rep(5,residual))#错误项会根据每个阈值不同而变化t_seq <- seq(0.1,0.9,by = 0.1)index_mat <- matrix(ncol = (n_folds+1) , nrow = length(t_seq))index_mat[,1] <- t_seq #计算每个折的CV错误的主要循环for (i in 1:5){ train <- dataset %>% filter(cv_labels != i) test <- dataset %>% filter(cv_labels == i ) brglm_cv_model <- brglm(formula = response_var ~ . , family = "binomial", data = train ) brglm_cv_pred <- predict(object = brglm_model, newdata = test , type = "response") #你想要的错误公式,例如分类错误 counter <- 0 for (treshold in t_seq ) { counter <- counter + 1 conf_mat <- table( factor(test$response_var) , factor(brglm_cv_pred>treshold, levels = c("FALSE","TRUE") )) sen <- conf_mat[2,2]/sum(conf_mat[2,]) #其他指标可以如下计算 #spec <- conf_mat[1,1]/sum(conf_mat[1,]) #prec <- conf_mat[2,2]/sum(conf_mat[,2]) #F1 <- (2*prec * sen)/(prec+sen) #accuracy <- (conf_mat[1,1]+conf_mat[2,2])/sum(conf_mat) #这里我只对敏感性感兴趣 index_mat[counter,(i+1)] <- sen }}#最终数据框将是每个阈值敏感性的平均值 final_mat <- matrix(nrow = length(t_seq), ncol = 2 )final_mat[,1] <- t_seq final_mat[,2] <- apply(X = index_mat[,-1] , MARGIN = 1 , FUN = mean)final_mat <- data.frame(final_mat)colnames(final_mat) <- c("treshold","sensitivity")#为什么不看看模型在不同阈值下的CV敏感性呢?ggplot(data = final_mat) + geom_line(aes(x = treshold, y = sensitivity ), color = "blue")