针对二分因变量的模型,运用Logistic模型进行训练,意图是把因变量从二元结构变换成整个实数轴
如果把二元结构看做事件A发生或者不发生,二元结构就可以转化成从0到1的概率,通过P(A)/(1-P(A)),我们把从0到1的概率结构转化成了从0到无穷的odds
通过log P(A)/(1-P(A))我们把从0到无穷的odds转化成了整个实数轴,即log P(A)/(1-P(A)) = kx+b,经过一定变换,P(A) = [e^(kx+b)]/[1+e^(kx+b)],为广义线性模型,模型的估算方法则是最大似然估计
代码如下:
```
glm (Y~X, data, family = binominal (logit))
fram_data = read.csv ("Framingham.dat", sep = ',', header = T, stringsAsFactors = F)#经典的数据Framingham心脏病研究,读取数据
View (fram_data)
boxplot (fram_data$SBP~fram_data$Heart.Disease., ylab = 'SBP', xlab = 'HD')#绘制箱线图
```
通过散点图的形式呈现出来,代码如下:
```
plot (fram_data$SBP, fram_data$Heart.Disease., col = as.factor (fram_data$Heart.Disease.), xlab = 'SBP', ylab = 'HD') #做出散点图
legend ('topright', legend = c('0', '1'), lty = c (1, 1), lwd = c (2, 2), col = unique (as.factor (fram_data$Heart.Disease.))) #标出图例
```
将这个散点图以更为清晰分散的形式画出
```
plot (jitter (fram_data$Heart.Disease., factor = .5)~fram_data$SBP, pch = 4, col = as.factor (fram_data$Heart.Disease.), ylab = 'HD', xlab = "SBP") #通过jitter函数将点错开,散开程度由factor的值控制
legend ('topright', legend = c('0', '1'), lty = c (1, 1), lwd = c (2, 2), col = unique (as.factor(fram_data$Heart.Disease.)))
```
进行logistic回归:
```
log.fit1 = glm (Heart.Disease. ~SBP, data = fram_data, family = binomial (logit))
summary (log.fit1)
```
模型标准:AIC越小越好,SBP(血压)与心脏病概率显著性较强,二者是正相关的
关于SBP系数,由于不是简单地线性模型,因此系数不如前面的系数能够体现二者的相互影响大小
logistic回归同样可以进行多远回归,代码的变化和前面的多元线性回归的代码方法类似
在多个模型之间进行选择,可以使用bestglm函数,需下载bestglm程序包
在进行选择之前,首先需要对数据进行处理便于选择
```
fram_data.f = na.omit(fram_data) #把na缺省的数据忽略掉
Xy = model.matrix (Heart.Disease.~.+0, fram_data.f) #设计出矩阵,.+0意思是不使用截距项
Xy = data.frame (Xy, fram_data.f$Heart.Disease.) #筛选出相关变量
```
对模型进行筛选
```
fit.all = bestglm (Xy, family = binomial, method = 'exhaustive', IC = 'AIC', nvmax = 10)#ic为筛选标准是AIC,nvmax是模型自变量的最高数量
fit.all$BestModels
```
前二个和第三四个是完全等价的,由于性别上进行了区分,筛选出最好的预测模型,根据模型可以计算出每个人患心脏病的概率,具体选择哪一个模型根据实际情况。