关于逻辑回归的问题

机器算法验证 回归 时间序列 物流 空间的 生态
2022-03-24 22:54:40

我想运行二元逻辑回归来模拟 10 年期间(1997-2006 年)内一组自变量中是否存在冲突(因变量),每年有 107 个观察值。我的独立人士是:

  • 土地退化(分类为两种退化);
  • 人口增长(0-否;1-是);
  • 生计类型(0 - 类型一;1 - 类型二);
  • 人口密度(三级密度);
  • NDVI连续(最大蔬菜生产力);
  • NDVIt1(蔬菜比上一年下降 - 0 - 否;1 - 是)和
  • 和 NDVIt2(蔬菜从过去两年开始下降 - 0- 否;1- 是)。

我对这一切都很陌生——这是我的讲师给我的一个项目——所以我会很感激一些建议或指导。我已经测试了多重共线性。

本质上,我的数据分为 107 个观察单位(空间区域),涵盖 10 年(总共 1070 个),并且对于每个观察单位,它给出了当时该单位内自变量条件的“快照”值(地区)。我想知道如何设置我的逻辑回归(或表格)以分别识别每年的 107 个值,以便可以评估不同单位年份之间的时间 NDVI 变化?

2个回答

这实际上是一个非常复杂的问题,也是讲师提出的一个棘手问题!

就组织数据的方式而言,1070 x 10 的矩形就可以了。例如,在 R 中:

> conflict.data <- data.frame(
+ confl = sample(0:1, 1070, replace=T),
+ country = factor(rep(1:107,10)),
+ period = factor(rep(1:10, rep(107,10))),
+ landdeg = sample(c("Type1", "Type2"), 1070, replace=T),
+ popincrease = sample(0:1, 1070, replace=T),
+ liveli =sample(0:1, 1070, replace=T),
+ popden = sample(c("Low", "Med", "High"), 1070, replace=T),
+ NDVI = rnorm(1070,100,10),
+ NDVIdecl1 = sample(0:1, 1070, replace=T),
+ NDVIdecl2 = sample(0:1, 1070, replace=T))
> head(conflict.data)
  confl country period landdeg popincrease liveli popden     NDVI NDVIdecl1 NDVIdecl2
1     1       1      1   Type1           1      0    Low 113.4744         0         1
2     1       2      1   Type2           1      1   High 103.2979         0         0
3     0       3      1   Type2           1      1    Med 109.1200         1         1
4     1       4      1   Type2           0      1    Low 112.1574         1         0
5     0       5      1   Type1           0      0   High 109.9875         0         1
6     1       6      1   Type1           1      0    Low 109.2785         0         0
> summary(conflict.data)
     confl           country         period     landdeg     popincrease         liveli        popden         NDVI          NDVIdecl1        NDVIdecl2     
 Min.   :0.0000   1      :  10   1      :107   Type1:535   Min.   :0.0000   Min.   :0.0000   High:361   Min.   : 68.71   Min.   :0.0000   Min.   :0.0000  
 1st Qu.:0.0000   2      :  10   2      :107   Type2:535   1st Qu.:0.0000   1st Qu.:0.0000   Low :340   1st Qu.: 93.25   1st Qu.:0.0000   1st Qu.:0.0000  
 Median :1.0000   3      :  10   3      :107               Median :1.0000   Median :1.0000   Med :369   Median : 99.65   Median :1.0000   Median :0.0000  
 Mean   :0.5009   4      :  10   4      :107               Mean   :0.5028   Mean   :0.5056              Mean   : 99.84   Mean   :0.5121   Mean   :0.4888  
 3rd Qu.:1.0000   5      :  10   5      :107               3rd Qu.:1.0000   3rd Qu.:1.0000              3rd Qu.:106.99   3rd Qu.:1.0000   3rd Qu.:1.0000  
 Max.   :1.0000   6      :  10   6      :107               Max.   :1.0000   Max.   :1.0000              Max.   :130.13   Max.   :1.0000   Max.   :1.0000  
                  (Other):1010   (Other):428                                                                                                              
> dim(conflict.data)
[1] 1070   10

为了拟合模型,@gui11aume 建议的 glm() 函数将做基础......

mod <- glm(confl~., family="binomial", data=conflict.data)
anova(mod)

...但这有一个问题,它将“国家”(我假设您将国家作为您的 107 个单位)视为固定效应,而随机效应更合适。它还将周期视为一个简单的因素,不允许自相关。

您可以使用广义线性混合效应模型解决第一个问题,例如Bates 等人在 R 中的 lme4包。这里有一个很好的介绍就像是

library(lme4)
mod2 <- lmer(confl ~ landdeg + popincrease + liveli + popden + 
    NDVI + NDVIdecl1 + NDVIdecl2 + (1|country) +(1|period), family=binomial,
    data=conflict.data)
summary(mod2)

将是向前迈出的一步。

现在你剩下的最后一个问题是你的 10 个周期的自相关。基本上,您在每个国家/地区的 10 个数据点的价值不如它们是 10 个随机选择的独立且相同分布的点。我不知道有一个广泛可用的软件解决方案来解决具有非正态响应的多级模型的残差中的自相关。当然它没有在 lme4 中实现。其他人可能比我知道的更多。

本教程内容全面。

在 R 中,您需要准备数据,例如dataa中的变量data.frame,其中第一列是您的 0-1 变量(冲突),其他列是预测变量。对于分类变量,您必须确保它们的类型为factor例如,要确保第 3 列具有此属性,您可以通过 强制执行data[,3] <- as.factor(data[,3])

那么这只是一个问题

glm(data, family="binomial")

这隐含地假设您有一个加法模型并为您提供估计值。要获得更全面的输出,通过测试单个参数,您可以执行

summary(glm(data, family="binomial"))