logistic回归模型—基于R

article/2025/8/27 19:45:31

logistic回归模型—基于R

  • 数据理解和准备
    • 一. 对缺失值的处理
    • 二.虚拟变量的赋值
    • 三.箱线图
    • 四.相关性分析
  • 训练集与测试集的划分
  • 模型构建与评价
    • 一.logistic回归模型
    • 二.检查模型在训练数据集和测试数据集上的表现
    • 使用交叉验证的logistic回归

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。例如,探讨引发疾病的危险因素,并根据危险因素预测疾病发生的概率等。以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。然后通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到底哪些因素是胃癌的危险因素。同时根据该权值可以根据危险因素预测一个人患癌症的可能性。

数据理解和准备

library(MASS)
data(biopsy)
biopsy

在这里插入图片描述
数据集包含699个患者的样本组织,保存在11个变量的数据框中,如下所示:

  • ID:样本编码
  • V1:细胞浓度
  • V2:细胞大小均匀度
  • V3:细胞形状均匀度
  • V4:边缘黏着度
  • V5:单上皮细胞大小
  • V6:裸细胞核(16个观测值确实)
  • V7:平和染色质
  • V8:正常核仁
  • V9:有丝分裂状态
  • class:肿瘤诊断结果,良性或恶性:这就是我们要预测的结果变量
    首先把样本的编码删除
biopsy$ID=NULL

一. 对缺失值的处理

由于缺失值只有16个,占所有观测的2%,所以我们只要删除缺失值即可

biopsy <- na.omit(biopsy)

当然你也可以通过插值法来对缺失值进行处理
可以看这篇文章处理缺失值

二.虚拟变量的赋值

考虑将class的两个类别malignant,benign分别赋值为1,0
通过ifelse函数来实现

y <- ifelse(biopsy$class=="malignant",1,0);y

三.箱线图

library(tidyverse)
library(reshape2)
biopsy1 <- melt(biopsy,id.var="class");biopsy1
#箱线图
ggplot(biopsy1,aes(class,value))+geom_boxplot(aes(color=variable))+facet_wrap(~variable,ncol=3)

在这里插入图片描述

四.相关性分析

library(corrplot)
cor(biopsy[,1:9])%>% corrplot.mixed()

在这里插入图片描述
从相关系数可以看出,我们会遇到共线性问题,特别是V2和V3之间的相关系数高达0.91,表现出很明显的共线性

训练集与测试集的划分

有多种方式可以将数据恰当的划分为训练集和测试集:50/50,60/40,70/30,80/20,诸如此类。你应该选择自己的经验和判断选择数据划分方式。在本例中,我选择按照70/30的比例划分数据。如下所示

set.seed(123)
ind <- sample(2,nrow(biopsy1),replace = T,prob=c(0.7,0.3))
ind
train <- biopsy[ind==1,];train
test <- biopsy[ind==2,];test

为了确保两个数据集的结果变量时均衡的,我们做以下检查

table(train$class)
table(test$class)

在这里插入图片描述
这个内部比例是可以接受的

模型构建与评价

一.logistic回归模型

fit <- glm(class~.,family=binomial,data=train)
summary(fit)
#检查多重共线性
library(car)
vif(fit)

在这里插入图片描述
在这里插入图片描述
由于vif值都小于5,可以排除多重共线性的影响

二.检查模型在训练数据集和测试数据集上的表现

首先要建立一个向量表示预测概率:

train.probs <- predict(fit,type="response")

下一步需要评价模型在训练集上的效果,然后在评价它在测试集上的拟合程度。
这时我们需要0和1来表示,函数良性区别结果和恶性结果使用的默认值是0.5,也就是说,当概率大于0.5时,就认为这个结果是恶性的

train.probs <- predict(fit,type="response")
train.probs <- ifelse(train.probs >=0.5,1,0)
trainy <- y[ind==1] 
testy <- y[ind==2]
#install.packages("caret")
library(caret)
confusionMatrix(table(trainy, train.probs))

在这里插入图片描述
对角线上的就是我们预测错误数值:

error=(7+8)/474;error

在这里插入图片描述
可以看到预测错误率为0.03
接下来在数据在测试集上的表现:

testy <- y[ind==2]
length(testy)
test.probs <- predict(fit,newdata=test,type="response") #注意这里是newdata
test.probs <-  ifelse(test.probs>=0.5,1,0)
length(test.probs)
confusionMatrix(table(testy, test.probs))
error1 <- (2+3)/209;error1

在这里插入图片描述
在这里插入图片描述
可以看到预测错误率仅为0.02

使用交叉验证的logistic回归

交叉验证
对于原始数据我们要将其一部分分为train data,一部分分为test data。train data用于训练,test data用于测试准确率。在test data上测试的结果叫做validation error。将一个算法作用于一个原始数据,我们不可能只做出随机的划分一次train和test data,然后得到一个validation error,就作为衡量这个算法好坏的标准。因为这样存在偶然性。我们必须好多次的随机的划分train data和test data,分别在其上面算出各自的validation error。这样就有一组validation error,根据这一组validation error,就可以较好的准确的衡量算法的好坏。

Logistic 回归详解 交叉验证概念
我们将用bestglm包进行交叉验证

install.packages("bestglm")
library(bestglm)
X <- train[,1:9]
XY <- data.frame(cbind(X,trainy))
bestglm(Xy=XY,IC="BIC",family=binomial)

在上面的代码中。Xy=XY指的是我们已经格式化的数据框,IC="BIC"告诉程序我们使用的信息准则为交叉验证
在这里插入图片描述
接下来看看BIC最优子集算法的预测效果

bicfit <- glm(class~V1+V4+V6+V8,family=binomial,data=train)
test.bic.probs <- predict(bicfit,family=binomial,newdata=test,type="response")
test.bic.probs <- ifelse(test.bic.probs>=005,1,0)
confusionMatrix(table(testy,test.bic.probs))

在这里插入图片描述
可以看到正确率ACCURACY为0.97


http://chatgpt.dhexx.cn/article/8rXkSV0g.shtml

相关文章

数学模型——Logistic回归模型(含Matlab代码)

写在前面 Logistic回归模型是一种非常常见的统计回归模型&#xff0c;在处理大量数据&#xff0c;揭示各自变量如何作用于因变量&#xff08;描述X与Y之间的关系&#xff09;时有着十分重要的作用。笔者在写Logit回归模型前参加了一次市场调研比赛&#xff0c;在这次比赛中学到…

菜鸟的数学建模之路(五):Logistic模型

matlab实现 Logistic回归跟多元线性回归差不多&#xff0c;但是有区别&#xff1a; &#xff08;1&#xff09; 线性回归&#xff1a;y是一个定量的变量&#xff0c;这时y对于不同的自变量来说有相应的值。 &#xff08;2&#xff09; Logistic回归&#xff1a;y是一个定性的变…

自学鸿蒙应用开发(25)- 基本的CommonDialog

动作演示 对话框是应用程序的主要输入手段之一&#xff0c;但是遗憾的是目前鸿蒙的开发网站上只有ToastDialog用法&#xff0c;其他类型的对话框则只能参考为数不多的英文文档。 以下是作者经过不断尝试&#xff0c;终于鼓捣出来的CommonDialog对话框。 CommonDialog1 代码实…

Builder设计模式构建通用型Dialog

目录 写在前面 一、什么是Builder模式 二、AlertDialog源码分析 2.1、源码阅读 2.2、Builder模式工作流程 三、代码实战——Builder模式构建通用型Dialog 3.1、基本框架搭建 3.2、完善Builder 3.3、完善真正的构建器 3.4、自定义参数配置 四、使用Dialog 写在前面 …

自学鸿蒙应用开发(26)- 自定义CommonDialog

执行效果 上一篇文章中说过&#xff0c;直接使用鸿蒙系统中的CommonDialog大致是下面的效果&#xff1a; 这个效果实在是无法用于实际的应用开发。本文介绍如何定制自己的CommonDialog。还是先看演示视频&#xff1a; CustomizeCommonDialog 准备布局 定制CommonDialog的第一…

Android炫酷翻转Dialog及高仿苹果IOS的Dialog

简单的Android弹出Dialog效果&#xff08;圆角&#xff09; 最近一段时间工作挺忙的&#xff0c;一直想写一篇博文&#xff0c;总是被各种事情打破计划&#xff0c;终于这次利用这个周末来开始自己第一次的技术文章的写作&#xff0c;提前说明&#xff0c;本人还是个菜鸟&#…

Android 全局Dialog

前沿 android 弹窗好几种&#xff0c;全局弹窗是什么&#xff1f;和普通Dialog&#xff08;必须依附activity上下文的弹窗&#xff09;有什么区别&#xff1f; 逛技术blog发现【全局dialog】这个名词&#xff0c;之前用FragmentDialog&#xff0c;自定义dialog。以及dialog的…

Android开发dialog内存泄露,Android中导致内存泄漏的竟然是它----Dialog

一. 内存泄漏的 Bug 猛增 最近在 App 进行 mokey 测试的时候检测到一些内存泄漏问题。在前天的测试中,楼主一瞬间收到了4个这样的 Bug 单,瞬间心理无比纠结,真有千万只羊驼向我奔来。 登录页面出现内存泄漏??!!楼主的代码是如此的***而无懈可击,这么可能出现这么多泄漏的…

dialog.setOnDismissListener(null)过程分析

前提 为解决DialogFragment的内存泄漏&#xff0c;使用了此篇博客的处理方法 DialogFragment 内存泄露&#xff0c;简单说就是给 dialog 设置 getDialog().setOnCancelListener(null); getDialog().setOnDismissListener(null);但发现了一个问题&#xff0c;当用户返回Activi…

深入分析Android中Dialog

在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构&#xff0c;通过它&#xff0c;可以总体对Dialog有一个很清晰的认识. 从这张图中可以看到&#xff0c;Dialog为父类, 其下有最重要的&#xf…

android自定义dialog去除title,Android 自定义Dialog去除title导航栏的解决方法

Android 自定义Dialog去除title导航栏的解决方法 如下所示: Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); 以上这篇Android 自定义Dialog去除title导航栏的解决方法就是小编分享给大家的全部内…

android常见的dialog的使用及认识

介绍 在实际开发过程中 , 我们难免要经常使用提示框 (dialog), 根据不同的场景使用不同的样式的提示框(dialog). androd提供了丰富的dialog函数 , 本文将介绍在实际开发中经常使用的对话框, 包括普通对话框 , 列表对话框 , 单选对话框 , 多选对话框 , 等待对话框, 进度条对话框…

ABAP屏幕设计Dialog

目录 一、概览 1.屏幕 2.程序组织 3.屏幕定义和维护 用途&#xff1a; 组成&#xff1a; Dialog的屏幕执行过程&#xff1a; 属性&#xff1a; 创建&#xff1a; 4.屏幕属性的动态修改 5.屏幕序列 二、Screen编程实例 1.Hello World屏幕编程 建立程序&#xff1a; 设计…

Android Dialog 源码研究

Android Dialog 源码研究 在阅读Dialog源代码之前,我给自己提出了4个问题,带着这4个问题的疑问,我才开始看源码,这样的好处能让阅读中有了侧重点,往往能更快的理解某些代码的意图,这也正是为什么总说提出问题本身,要比解决问题困难。 我下面要思考的4个问题是: Dialo…

android 判断dialog,Android 7.0经验谈:Dialog不显示之迷

最近遇到个怪问题,在其他手机上都能正常的显示Dialog,但是在Android 7.0的手机上只能显示Dialog的半透明背景,无法显示Dialog的内容。 用图给大家展示一个遇到的现象,正常时应该是这个样子的: 而我们遇到的情况如下,更坏的是如果我们设置Dialog不能点击空白处取消(dismis…

Android窗口设计之Dialog、PopupWindow、系统窗口的实现

窗口设计之Dialog、PopupWindow、系统窗口的实现 Android应用程序窗口设计系列博客: Android应用程序窗口设计之Window及WindowManager的创建 Android应用程序窗口设计之setContentView布局加载的实现 普法Android的Token前世今生以及在APP,AMS,WMS之间传递 Android应用程序窗口…

理解Android中Dialog

文章收藏的好句子&#xff1a;你能走多远、爬多高&#xff0c;不仅取决于你自身的力量&#xff0c;还取决于周围人带动的力量。 PS&#xff1a;本文是基于 Android Api 26 来分析源码的。 1、Dialog 的 Window 是在哪里创建的&#xff1f; Dialog 的 Window 是在什么地方创建的…

Android之Dialog分析

Android之Dialog分析 以Dialog为引导&#xff0c;Android的弹出式消息一共是三种&#xff08;据我所知&#xff09;&#xff1a;Dialog&#xff0c;tocast&#xff0c;notification 其三种弹出式消息各有所长。今天重点是分析其中的Dialog。Android的Dialog是android界面编程的…

Android开发dialog内存泄露,Dialog引发的内存泄漏

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文是本人对于 LeakCanary 团队的一篇分析内存泄漏的文章的意译。水平有限,如有不够准确之处,敬请包涵。 主旨:在Lollipop之前的版本,Dialog可能导致内存泄漏。 引言 LeakCanary 提示存在内…

android源码分析-Dialog

今天给大家介绍android -Dialog源码分析 Dialog 是所有对话框的基类&#xff0c;例如AlertDialog&#xff0c;我们要深入了解指导Dialog的用法&#xff0c;逻辑&#xff0c;必须要把Dilaog弄清楚&#xff0c;下面首先我们来看下Google对Dialog的类描述&#xff1a;/**Base clas…