从0开始学习R语言--Day44--LR检验

之前我们提到用LM检验的方式,来判断数据在空间上是否受到邻近数据及其残差的影响,但是LM检验是采用直接计算的方式,只关注了数据的残差平方和,没有数据关于依赖项的考虑,容易被结果误导。

而LR检验虽然在结果上有时候跟LM的计算差不多,但是其意义和公式都是为了考虑邻近数据对数据原本的影响,且更灵活,他在多出来的考虑项外多出一个系数用于判断是否真的受到邻近数据的影响(当然最好是先进行Moran'sI检验,对空间溢出性做判断,这样更严谨,因为有时候只对模型本身参数做计算检验会有幻觉,出现模型本身拟合很好,但是空间溢出性不显著的结果)。

以下是LR-lag和LR-error的例子:

复制代码
# 加载必要的包
library(spdep)
library(splm)



# 生成模拟空间数据(示例)
set.seed(123)
n <- 100  # 100个观测点
coords <- cbind(runif(n), runif(n))  # 随机生成坐标
knn <- knn2nb(knearneigh(coords, k = 4))  # 基于KNN构建空间权重矩阵
W <- nb2listw(knn, style = "W")  # 行标准化权重矩阵

# 生成解释变量和被解释变量
X <- rnorm(n)
rho <- 0.5  # 空间自回归系数(模拟真实存在空间滞后效应)
y <- solve(diag(n) - rho * listw2mat(W)) %*% (X * 1.5 + rnorm(n, sd = 0.5))

# 估计 SAR 模型(含空间滞后项)
sar_model <- lagsarlm(y ~ X, listw = W, method = "eigen")

# 估计 OLS 模型(无空间滞后项)
ols_model <- lm(y ~ X)

# LR-lag 检验(比较 SAR 和 OLS)
LR_lag <- 2 * (logLik(sar_model) - logLik(ols_model))
p_value <- pchisq(LR_lag, df = 1, lower.tail = FALSE)  # 自由度df=1(因为只检验rho是否=0)

cat("LR-lag 统计量:", LR_lag, "\nP值:", p_value, "\n")
# 如果 P < 0.05,说明空间滞后项显著,SAR 比 OLS 更好


# 继续使用之前生成的数据

# 估计 SEM 模型(含空间误差项)
sem_model <- errorsarlm(y ~ X, listw = W, method = "eigen")

# 估计 OLS 模型(无空间误差项)
ols_model <- lm(y ~ X)

# LR-error 检验(比较 SEM 和 OLS)
LR_error <- 2 * (logLik(sem_model) - logLik(ols_model))
p_value <- pchisq(LR_error, df = 1, lower.tail = FALSE)  # 自由度df=1(检验λ是否=0)

cat("LR-error 统计量:", LR_error, "\nP值:", p_value, "\n")
# 如果 P < 0.05,说明空间误差项显著,SEM 比 OLS 更好

输出:

R 复制代码
LR-lag 统计量: 88.36325 
P值: 5.447355e-21 
LR-error 统计量: 56.78365 
P值: 4.864945e-14 

这里的输出显示两个p值都小于,结果显著,推翻原假设,即不能退化为SAR或SEM模型,要用SDM,即杜宾模型去拟合数据。不过要特别注意的是,有时候会出现Wald检验与LR-lag冲突的现象,建议先看样本量,如果样本量较小(<100),那么优先考虑LR-lag,并检查空间权重矩阵是否合理,用其他的空间权重矩阵验证结果。