在R中绘制二进制和连续值的多重逻辑回归

时间:2016-04-29 15:39:05

标签: r plot logistic-regression

我有一个哺乳动物属的数据框。该列的每一行都是不同的属。有三列:每个属的列的地理范围大小(一个连续变量),一个列表明是否在河流流域内部或外部发现了一个属(二进制变量),还有一列说明是否该属在化石记录中找到(二元变量)。

我已经进行了多重逻辑回归,以查看地理范围大小和进出盆地是否是使用以下R代码预测化石记录的存在。

Regression<-glm(df[ ,"FossilRecord"] ~ log(df[ ,"Geographic Range"]) + df[  ,"Basin"], family="binomial")

我试图找到一种方法来直观地总结这种回归的输出(除了回归摘要表之外)。

我知道如何为单变量回归做到这一点。例如,如果我想看到地理范围大小与化石记录中的存在之间的关系,我可以使用像this one这样的情节。

但是,当有两个独立变量时,我不知道如何制作类似或等效的图,其中一个是二进制。在这种情况下我可以使用哪些绘图和数据可视化技术?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您可以为分类变量的每个值绘制单独的曲线。您没有提供样本数据,因此这是另一个数据集的示例:

library(ggplot2)

# Data
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")

# Model. gre is continuous. rank has four categories.
m1 = glm(admit ~ gre + rank, family=binomial, data=mydata)

# Predict admit probability
newdata = expand.grid(gre=seq(200,800, length.out=100), rank=1:4)
newdata$prob = predict(m1, newdata, type="response")

ggplot(newdata, aes(gre, prob, color=factor(rank), group=rank)) +
  geom_line()

enter image description here

更新:要响应@Provisional.Modulation的评论:根据您要突出显示的内容以及视觉上清晰易懂的内容,有很多选项,具体取决于您的特定数据和模型输出。

以下是使用内置mtcars数据框和逻辑回归的示例,其中包含一个分类和两个连续预测变量:

m1 = glm(vs ~ cyl + mpg + hp, data=mtcars, family=binomial)

现在我们创建一个新的数据框,其中包含cyl的唯一值,hp的五个分位数和mpg的连续序列,我们将其放在x轴上(你当然也可以使用mpg的分位数并使用hp作为x轴变量)。如果您有许多连续变量,则在绘制其他变量之间的关系时,可能需要将其中一些设置为单个值,例如中位数。

newdata = with(mtcars, expand.grid(cyl=unique(cyl), 
                                   mpg=seq(min(mpg),max(mpg),length=20),
                                   hp = quantile(hp)))

newdata$prob = predict(m1, newdata, type="response") 

这是三个潜在的图表,具有不同程度的易读性。

ggplot(newdata, aes(mpg, prob, colour=factor(cyl))) +
  geom_line() +
  facet_grid(. ~ hp)

ggplot(newdata, aes(mpg, prob, colour=factor(hp), linetype=factor(cyl))) +
  geom_line()

ggplot(newdata, aes(mpg, prob, colour=factor(hp))) +
  geom_line() +
  facet_grid(. ~ cyl)

这是使用geom_tile在每个绘图面板中包含两个连续维度的另一种方法。

newdata = with(mtcars, expand.grid(cyl=unique(cyl), 
                                   mpg=seq(min(mpg),max(mpg),length=100),
                                   hp =seq(min(hp),max(hp),length=100)))

newdata$prob = predict(m1, newdata, type="response")     

ggplot(newdata, aes(mpg, hp, fill=prob)) +
  geom_tile() +
  facet_grid(. ~ cyl) +
  scale_fill_gradient2(low="red",mid="yellow",high="blue",midpoint=0.5,
                       limits=c(0,1))

答案 1 :(得分:3)

可视化非常重要,但却非常困难。在您的示例中,我建议为您的分类协变量(盆地)的每个级别绘制一条预测FossilRecord与GeographicRange的线。以下是如何使用ggplot2

执行此操作的示例
##generating data
ssize <- 100
set.seed(12345)
dat <- data.frame(
  Basin =  rbinom(ssize, 1,.4),
  GeographicRange = rnorm(ssize,10,2)
)
dat$FossilRecord = rbinom(ssize,1,(.3 + .1*dat$Basin + 0.04*dat$GeographicRange))

##fitting model
fit <- glm(FossilRecord ~ Basin + GeographicRange, family=binomial(), data=dat)

我们可以使用predict()函数获取许多GeographicRange值和每个Basin类别的预测响应值。

##getting predicted response from model
plotting_dfm <- expand.grid(GeographicRange = seq(from=0, to = 20, by=0.1),
                           Basin = (0:1))
plotting_dfm$preds <- plogis( predict(fit , newdata=plotting_dfm))

现在您可以绘制预测结果:

##plotting the predicted response on the two covariates
library(ggplot2)
pl <- ggplot(plotting_dfm, aes(x=GeographicRange, y =preds, color=as.factor(Basin)))
pl + 
  geom_point( ) +
  ggtitle("Predicted FossilRecord by GeoRange and Basin") + 
  ggplot2::ylab("Predicted FossilRecord")

这将生成如下图: enter image description here

答案 2 :(得分:0)

如果您正在寻找固定解决方案,visreg package可能适合您。

使用@ eipi10数据的示例

library(visreg)
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
m1 = glm(admit ~ gre + rank, family=binomial, data=mydata)
visreg(m1, "admit", by = "rank")

enter image description here

documentation中描述的更多选项。