逻辑回归的解释和绘图
Interpretation and plotting of logistic regression
我目前正在进行一项涉及不同种类蝙蝠和栖息地破碎化的研究。我的数据集包含存在数据(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()
生成以下图像:
是什么导致了这些差异,哪一个是正确的?
Sample data set(未分类的部分数据集)。
您链接到的资源在标题 Using the logit model
下的项目符号部分中有解释说明。 Estimate
是每个协变量对 log-odds 存在的累加效应。这是每增加 1 个单位的连续 co-variate 或每个分类实例。关于这一点的几点:
- 因为您采用了连续协变量的对数,它们的影响是对数尺度上每 1 个单位的影响 - 很难解释。我强烈建议不要这样做。不需要
FragSize
或 Mass
的正态性来拟合此模型。
- 注意到您的某个类别从列表中丢失了吗?必须根据某些参考来衡量协变量的影响。在这种情况下,参考是
logFrag
=0 和 logMass
=0 的食肉动物。这些 0 值是不可能的。这很正常,为什么解释 (Intercept)
对你没用。
到 Std. Error
,这是衡量您对 Estimate
效果的信心。人们经常使用 Estimate
周围的正态近似值 +- 2*Std. Error
来形成置信区间并使用它们进行陈述。当 +- 2*Std. Error
的区间包含 0 时,真实效果有可能为 0。您不希望这样,因此您正在寻找 Std. Error
的小值Estimate
z value
和 Pr(>|z|)
与我提到的正态近似有关。您可能已经知道 Z 分数(标准正态)是什么以及人们如何使用它们来执行显着性检验。
现在开始你的情节:
这些图实际上并没有绘制您的模型。您正在使用平滑器来拟合类型相似但数据集不同的新模型。 smoother只是考虑logFrag
的效果,在每个行会内拟合一个mini logistic模型。
所以我们希望情节与 summary()
不同,但不会彼此不同。发生这种情况的原因很有趣,这与使用 bats2$presence
而不是 presence
有关。当你传入 bats2$presence
时,这实际上就像将一个单独的匿名数据列表传递给 ggplot2 一样。只要该列表与您期望的数据框对齐,一切都很好。似乎 facet_wrap() 在使用 bats2$presence
时混淆了数据,可能是由于按公会排序 bats2
。使用普通的旧 presence
,它们会一样。
我目前正在进行一项涉及不同种类蝙蝠和栖息地破碎化的研究。我的数据集包含存在数据(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()
生成以下图像:
是什么导致了这些差异,哪一个是正确的?
Sample data set(未分类的部分数据集)。
您链接到的资源在标题 Using the logit model
下的项目符号部分中有解释说明。 Estimate
是每个协变量对 log-odds 存在的累加效应。这是每增加 1 个单位的连续 co-variate 或每个分类实例。关于这一点的几点:
- 因为您采用了连续协变量的对数,它们的影响是对数尺度上每 1 个单位的影响 - 很难解释。我强烈建议不要这样做。不需要
FragSize
或Mass
的正态性来拟合此模型。 - 注意到您的某个类别从列表中丢失了吗?必须根据某些参考来衡量协变量的影响。在这种情况下,参考是
logFrag
=0 和logMass
=0 的食肉动物。这些 0 值是不可能的。这很正常,为什么解释(Intercept)
对你没用。
到 Std. Error
,这是衡量您对 Estimate
效果的信心。人们经常使用 Estimate
周围的正态近似值 +- 2*Std. Error
来形成置信区间并使用它们进行陈述。当 +- 2*Std. Error
的区间包含 0 时,真实效果有可能为 0。您不希望这样,因此您正在寻找 Std. Error
的小值Estimate
z value
和 Pr(>|z|)
与我提到的正态近似有关。您可能已经知道 Z 分数(标准正态)是什么以及人们如何使用它们来执行显着性检验。
现在开始你的情节:
这些图实际上并没有绘制您的模型。您正在使用平滑器来拟合类型相似但数据集不同的新模型。 smoother只是考虑logFrag
的效果,在每个行会内拟合一个mini logistic模型。
所以我们希望情节与 summary()
不同,但不会彼此不同。发生这种情况的原因很有趣,这与使用 bats2$presence
而不是 presence
有关。当你传入 bats2$presence
时,这实际上就像将一个单独的匿名数据列表传递给 ggplot2 一样。只要该列表与您期望的数据框对齐,一切都很好。似乎 facet_wrap() 在使用 bats2$presence
时混淆了数据,可能是由于按公会排序 bats2
。使用普通的旧 presence
,它们会一样。