R语言学习笔记:Logistic模型与选择(一)

针对二分因变量的模型,运用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

```

前二个和第三四个是完全等价的,由于性别上进行了区分,筛选出最好的预测模型,根据模型可以计算出每个人患心脏病的概率,具体选择哪一个模型根据实际情况。

你可能感兴趣的:(R语言学习笔记:Logistic模型与选择(一))