概念
The Mantel test, named after Nathan Mantel, is a statistical test of the correlation between two matrices. The matrices must be of the same rank(2个相同满秩的方阵才可以); in most applications, they are matrices of interrelations between the same vectors of objects. The test was first published by Nathan Mantel, a biostatistician at the National Institutes of Health, in 1967.[1]
Accounts of it can be found in advanced statistics books (e.g., Sokal & Rohlf 1995[2]).
如何在R中执行Mantel测试?
Mantel测试测量通常包含距离测量的两个矩阵之间的相关性。 Mantel测试是一种测试空间自相关的方法。 在ade4库使用功能,我们可以在河进行Mantel检测要下载和加载这个库,输入install.packages(“ade4”),然后library(ade4)。 在其他R库中还有其他Mantel测试功能,我们对这个库的选择不应该被视为任何方式的认可。
让我们看一个例子。 我们的数据集中, 臭氧 ,含有在聚合一个月以上洛杉矶地区32的位置臭氧测量。 该数据集包括的站号( 站 ),车站的纬度和经度(纬度和经度 ),最高8小时每日平均值(Av8top)的平均值。 我们将有兴趣测试是否距离较近的站相对于相距较远的站,臭氧测量的差异更小。 这些数据和其他空间数据集可以从伊利诺伊大学的空间分析实验室下载。 我们可以查看位置变量的摘要,以查看所考虑的位置范围。
ozone<-read.table("http://www.ats.ucla.edu/stat/r/faq/ozone.csv", sep=",", header=T)
head(ozone, n=10)
Station Av8top Lat Lon
1 60 7.225806 34.13583 -117.9236
2 69 5.899194 34.17611 -118.3153
3 72 4.052885 33.82361 -118.1875
4 74 7.181452 34.19944 -118.5347
5 75 6.076613 34.06694 -117.7514
6 84 3.157258 33.92917 -118.2097
7 85 5.201613 34.01500 -118.0597
8 87 4.717742 34.06722 -118.2264
9 88 6.532258 34.08333 -118.1069
10 89 7.540323 34.38750 -118.5347
要运行Mantel测试,我们需要生成两个距离矩阵:一个包含空间距离,一个包含在给定点的测量结果之间的距离。 在空间距离矩阵中,靠近在一起的点对的条目低于远离的点对的条目。 在测量的结果矩阵中,具有类似结果的位置对的条目低于具有不同结果的点对的条目。 我们今天使用DIST功能做的。 Mantel测试函数将需要此“距离”类的对象。
station.dists <- dist(cbind(ozone$Lon, ozone$Lat))
ozone.dists <- dist(ozone$Av8top)
as.matrix(station.dists)[1:5, 1:5]
1 2 3 4 5
1 0.0000000 0.3937326 0.4088031 0.6144127 0.1854888
2 0.3937326 0.0000000 0.3749446 0.2206810 0.5743590
3 0.4088031 0.3749446 0.0000000 0.5116772 0.4994034
4 0.6144127 0.2206810 0.5116772 0.0000000 0.7944601
5 0.1854888 0.5743590 0.4994034 0.7944601 0.0000000
as.matrix(ozone.dists)[1:5, 1:5]
1 2 3 4 5
1 0.000000 1.326612 3.172921 0.044354 1.149193
2 1.326612 0.000000 1.846309 1.282258 0.177419
3 3.172921 1.846309 0.000000 3.128567 2.023728
4 0.044354 1.282258 3.128567 0.000000 1.104839
5 1.149193 0.177419 2.023728 1.104839 0.000000
这些是函数将要测试相关性的两个矩阵。 该测试包括计算矩阵中的条目的相关性,然后置换矩阵并且在每个置换下计算相同的测试统计量,并且将原始测试统计量与来自置换的测试统计量的分布进行比较以生成p值。 置换的数量定义了可以计算p值的精度。 进行Mantel检验的功能是mantel.rtest和必需的参数是两个距离矩阵。 排列数也可以由用户指定,但默认为99。
mantel.rtest(station.dists, ozone.dists, nrepet = 9999)
Monte-Carlo test
Observation: 0.1636308
Call: mantel.rtest(m1 = station.dists, m2 = ozone.dists, nrepet = 9999)
Based on 9999 replicates
Simulated p-value: 0.0312
基于这些结果,我们可以拒绝零假设,这两个矩阵,空间距离和臭氧距离是无关的 ****其中α= 0.05。 观察到的相关性,r = 0.1636308,表明矩阵条目是正相关的。 因此,在彼此靠近而彼此远离的站之间通常看到较小的臭氧差异。 注意,由于该测试是基于随机排列,所以相同的代码将总是达到相同的观察到的相关性,但很少具有相同的p值。
代码
# Mantel test -------------------------------------------------------------
# example from "ape"
library("ape", lib.loc="D:/Program Files/R/R-3.1.2/library")
q1 <- matrix(runif(36), nrow = 12)
q2 <- matrix(runif(36), nrow = 6)
mantel.test(q1, q2, graph = TRUE,
main = "Mantel test: a random example with 6 X 6 matrices",
xlab = "z-statistic", ylab = "Density",
sub = "The vertical line shows the observed z-statistic")
# example from http://www.ats.ucla.edu/stat/r/faq/mantel_test.htm
library(ade4)
ozone<-read.table("http://www.ats.ucla.edu/stat/r/faq/ozone.csv", sep=",", header=T)
station.dists <- dist(cbind(ozone$Lon, ozone$Lat))
dim(station.dists)
ozone.dists <- dist(ozone$Av8top)
as.matrix(station.dists)[1:5, 1:5]
as.matrix(ozone.dists)[1:5, 1:5]
# 2个结果不一样
mantel.rtest(station.dists, ozone.dists, nrepet = 10000)
mantel.test(as.matrix(station.dists), as.matrix(ozone.dists),nperm = 10000)
网友评论