逻辑回归的解释和绘图

时间:2016-06-18 12:28:01

标签: r ggplot2 logistic-regression facet-wrap

我目前正在进行涉及不同种类的蝙蝠和栖息地破碎的研究。我的数据集包含存在数据(1 =存在,0 =不存在)和片段大小,体重(连续)和喂养公会的数据(Feeding.Guild;分类,6个级别:食肉动物,食肉动物食虫动物,食虫动物,杂食动物和血管动物)。使用自然日志转换片段大小(logFrag)和体重(logMass)以符合正态分布。由于被归类,我无法呈现完整的数据集(bats2)。

为了分析这些数据,我使用了逻辑回归。在R中,这是二项式族的glm函数。

bats2 <- read.csv("Data_StackExchange.csv", 
                 quote = "", sep=";", dec = ".", header=T, row.names=NULL)
bats2$presence <- ifelse(bats2$Corrected.Abundance == 0, 0, 1)
bats2$logFrag <- log(bats2$FragSize)
bats2$logMass <- log(bats2$Mass)
str(bats2$Feeding.Guild)
     Factor w/ 6 levels "carnivore","frugivore",..: 6 1 5 5 2 2 2 2 2 2 ...    
levels(bats2$Feeding.Guild)
    [1] "carnivore"    "frugivore"    "insectivore"  "nectarivore"  "omnivore"     "sanguinivore"


regPresence <- glm(bats2$presence~(logFrag+logMass+Feeding.Guild), 
                   family="binomial", data=bats2)

此回归的结果由summary()函数获得,如下所示。

Coefficients:
                          Estimate Std. Error z value Pr(>|z|)    
(Intercept)               -4.47240    0.64657  -6.917 4.61e-12 ***
logFrag                    0.10448    0.03507   2.979 0.002892 ** 
logMass                    0.39404    0.09620   4.096 4.20e-05 ***
Feeding.Guildfrugivore     3.36245    0.49378   6.810 9.78e-12 ***
Feeding.Guildinsectivore   1.97198    0.51136   3.856 0.000115 ***
Feeding.Guildnectarivore   3.85692    0.55379   6.965 3.29e-12 ***
Feeding.Guildomnivore      1.75081    0.51864   3.376 0.000736 ***
Feeding.Guildsanguinivore  1.73381    0.56881   3.048 0.002303 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

我的第一个问题是验证我是否正确解释了这些数据:如何正确解释这些数据?我使用this website来帮助我解释。

此外,我尝试绘制这些数据以便可视化。然而,当添加facet_wrap函数以为不同的饲养行会制作单独的图时,与在一个图中对不同的饲养行会着色相比,截距和斜率发生变化。我使用了以下代码:

情节1:

library(ggplot2)
qplot(logFrag, bats2$presence, colour=Feeding.Guild, data=bats2, se=F) +
  geom_smooth(method = glm, family = "binomial", se=F, na.rm=T) + theme_bw() 

情节2:

qplot(logFrag, bats2$presence, data=bats2, se=F) + facet_wrap(~Feeding.Guild, 
                                                              scales="free") +
  geom_smooth(method = glm, family = "binomial", se=F, na.rm=T) + theme_bw() 

导致以下图像:

Plot 1 (left) and plot 2 (right).

导致这些差异的原因是哪一个是正确的?

Sample data set(未分类的数据集的一部分)。

1 个答案:

答案 0 :(得分:1)

您链接到的资源在标题Using the logit model下的项目符号部分中有解释说明。 Estimate是每个协变量对存在的对数几率的累加效应。这是连续协变量或每个分类实例的每1个单位增加。关于这一点的几点:

  • 因为你已经记录了连续协变量,它们的效果在对数尺度上是每1个单位 - 很难解释。我强烈建议不要这样做。为了适应此模型,FragSizeMass不需要正常性。
  • 请注意,列表中缺少某个类别?必须根据某些参考来测量协变量的影响。在这种情况下,参考是具有logFrag = 0和logMass = 0的食肉动物。这些0值是不可能的。这是常见的,为什么(Intercept)的解释对你没用。

Std. Error上,这可以衡量您对Estimate效果的信心。人们经常在Std. Error周围使用+ - 2 * Estimate的正态近似值来形成置信区间并使用它们生成语句。当+ - 2 * Std. Error的间隔包含0时,真实效果有可能为0.您不希望这样,因此您需要查找{{1}的小值关于Std. Error

Estimatez value与我提到的正常近似有关。您可能已经知道Z分数(标准正常)是什么以及人们如何使用它们来执行重要性测试。

现在你的情节: 这些图实际上并没有绘制您的模型。您正在使用平滑器来拟合类似类型的新模型,但是使用不同的数据集。更顺畅的是只考虑Pr(>|z|)在每个公会中安装迷你后勤模型的效果。

因此我们希望这些图与logFrag不同,但不是彼此不同。发生这种情况的原因很有趣,而且使用summary()代替bats2$presence也是如此。当你传入presence时,这有效地就像传递ggplot2一个单独的匿名数据列表一样。只要该列表与您期望的数据帧一致,一切都很好。似乎facet_wrap()在使用bats2$presence时混淆了数据,可能是由于guild对bats2$presence进行了排序。使用普通的bats2,它们会相同。