R 逻辑回归乳腺癌数据
7-1 乳腺癌数据准备
loc <- "http://archive.ics.uci.edu/ml/machine-learning-databases/"
ds <- "breast-cancer-wisconsin/breast-cancer-wisconsin.data"
url <- paste(loc, ds, sep="")
breast <- read.table(url, sep=",", header=FALSE, na.strings="?")
names(breast) <- c("ID", "clumpThickness", "sizeUniformity",
"shapeUniformity", "maginalAdhesion",
"singleEpithelialCellSize", "bareNuclei",
"blandChromatin", "normalNucleoli", "mitosis", "class")
df <- breast[-1]
df$class <- factor(df$class, levels=c(2,4),
labels=c("benign", "malignant"))
set.seed(1234)
train <- sample(nrow(df), 0.7*nrow(df))
df.train <- df[train,]
df.validate <- df[-train,]
table(df.train$class)
table(df.validate$class)
逻辑回归(logistic regression)是广义线性模型的一种,可根据一组数值变量预测二元输出
(13.2节有详细介绍)。R中的基本函数glm()可用于拟合逻辑回归模型。glm()函数自动将预测变
量中的分类变量编码为相应的虚拟变量。威斯康星乳腺癌数据中的全部预测变量都是数值变量,
因此不必要对其编码。下面给出R中逻辑回归流程。
> fit.logit <- glm(class~., data=df.train, family=binomial())
> summary(fit.logit)
Call:
glm(formula = class ~ ., family = binomial(), data = df.train)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.7581 -0.1060 -0.0568 0.0124 2.6432
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -10.4276 1.4760 -7.06 1.6e-12 ***
clumpThickness 0.5243 0.1595 3.29 0.0010 **
sizeUniformity -0.0481 0.2571 -0.19 0.8517
shapeUniformity 0.4231 0.2677 1.58 0.1141
maginalAdhesion 0.2924 0.1469 1.99 0.0465 *
singleEpithelialCellSize 0.1105 0.1798 0.61 0.5387
bareNuclei 0.3357 0.1072 3.13 0.0017 **
blandChromatin 0.4235 0.2067 2.05 0.0405 *
normalNucleoli 0.2889 0.1399 2.06 0.0390 *
mitosis 0.6906 0.3983 1.73 0.0829 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> prob <- predict(fit.logit, df.validate, type="response")
> logit.pred <- factor(prob > .5, levels=c(FALSE, TRUE),
labels=c("benign", "malignant"))
> logit.perf <- table(df.validate$class, logit.pred,
dnn=c("Actual", "Predicted"))
> logit.perf
Predicted
Actual benign malignant
benign 118 2
malignant 4 76
首先,以类别为响应变量,其余变量为预测变量➊。基于df.train数据框中的数据构造逻
辑回归模型。接着给出了模型中的系数➋。系数解释见13.2节。
接着,采用基于df.train建立的模型来对df.validate数据集中的样本单元分类。
predict()函数默认输出肿瘤为恶性的对数概率,指定参数type="response"即可得到预测肿
瘤为恶性的概率➌。样本单元中,概率大于0.5的被分为恶性肿瘤类,概率小于等于0.5的被分为
良性肿瘤类。
最后给出预测与实际情况对比的交叉表(即混淆矩阵,confusion matrix)➍。模型正确判别
了118个类别为良性的患者和76个类别为恶性的患者。另外,df.validate数据集中有10个样本
单元因包含缺失数据而无法判别。
在验证集上,正确分类的模型(即准确率,accuracy)为(76+118)/200=97%,17.4节中将进
一步探讨评估模型有效性的统计量。
同时要注意的是,模型中有三个预测变量(sizeUniformity、shapeUniformity和
singleEpithelialCellSize)的系数未通过显著性检验(即p值大于0.1)。从预测的角度来说,
我们一般不会将这些变量纳入最终模型。当这类不包含相关信息的变量特别多时,可以直接将其
认定为模型中的噪声。
在这种情况下,可用逐步逻辑回归生成一个包含更少解释变量的模型,其目的是通过增加或
移除变量来得到一个更小的AIC值。具体到这一案例,可通过:
logit.fit.reduced <- step(fit.logit)
来得到一个精简的模型。这样,上面提到的三个变量就从最终模型中移除,这种精简后的模型在
验证集上的误差相对全变量模型更小。
