如何测试变量对R中点空间分布的影响

机器算法验证 r 相关性 空间的
2022-04-14 02:33:52

我正在尝试找到能够发现点空间分布模式的统计测试(或程序)。我通过举例说明鸟类领土的位置和鸟类的个性来勾勒这个问题。

1. 加载此示例数据(它们完全是虚构的)。数据包括领土的地理坐标和每只鸟的攻击程度。

示例数据:

x_coor<-rep(c(2,2.5,3,3.5,4,17,17.5,18,18.5,19,19.5,20,20.5,21,21.5,22,17.5,
18,18.5,19,31.5,32,32.5,33,33.5,1,1.5,2,3,4,5,16,17,18,19,20,21,22,23,24,25,
26,16,16.5,17,18,19,20,27.5,28.5,29.5,30.5,31,31.5,32,33,34,2,3,4,5,6,7,8,9,
12,13,14,15,16,18,20,21,22,23,24,25,26,28,29,30,31,32,33,34,1,7,8,10,14,22,
26,28,33),c(5,5,5,3,2,1,2,3,3,3,2,3,2,2,1,1,1,4,4,3,2,3,3,8,4,8,1,4,4,4,4,3,
2,2,2,2,2,2,3,3,3,1,1,1,3,5,5,7,1,2,3,3,3,1,5,5,5,4,1,2,2,3,2,2,3,1,2,4,3,3,
2,3,1,5,2,4,1,2,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2))
y_coor<-c(15,15.5,16,16.5,17,16,16.5,17,17.5,18,16,17,17.5,18,18.5,17.5,18,
18.5,18,18.5,22,22,22.5,21.5,22,22.5,21.5,22,22.5,21.5,22,22.5,21.5,22,21.5, 
22,22.5,22,22.5,22,22.5,22.5,22.5,7,6,6.5,7,7.5,5.5,6,6.5,7,5,5.5,6,16,16.5,
15,15.5,16,14,14.5,15,11,11.5,12,12.5,13,13.5,14,14.5,11.5,12,12.5,13,10,11,
12,13,14,15,16,17,18,13,14,19,20,14,15,20,21,15.5,16.5,20,21,17,18,19,20,21,
22,23,21,24,20,24,20,23.5,20,23.5,21,23.5,21,23.5,22,23,24,22,23,24,22,23,24,
23,7,6,4,5,8,2,3,4,5,8.5,1,2,3,4,8,1,2,3,4,5,6,7,16,16,17,16,17,18,16,17,18,
10,14,15,17.5,9,10,11,12,13,8,9,10,16,17,8,9,10,14,15,6,8,23,25,11,9,23,13,
25,11,15,22,18,20,14,23,16,18,20,6,3,9,1,6,22,24,4,9,19,2,12,26,11,18,10,18,
26,12,2,4,6,8,26,10,19,2,4,6,8,16,20,26,14,22,25,9,20,12,7,20,6,18,1,2,8,26,
15,15,10,4,1,25)
aggr_low<-1:35
aggr_mid<-25:65
aggr_big<-50:75
aggr_max<-70:100
aggression<-c(sample(aggr_low,75,replace=TRUE),sample(aggr_mid,100,
replace=TRUE),sample(aggr_big,62,replace=TRUE),sample(aggr_max,10,replace=TRUE))
my.data <- data.frame(x_coor, y_coor, aggression)
rbPal <- colorRampPalette(c("blue","red"))
my.data$Col <- rbPal(10)[as.numeric(cut(my.data$aggression,breaks = 10))]
par(mfrow=c(1,2))
plot(x_coor,y_coor,pch = 20,col = my.data$Col)

2. 正如你在图中看到的那样,低攻击性鸟类(蓝色)的领土倾向于聚集在一起,而攻击性鸟类是孤独的(红色)。

我花了很长时间寻找可以确认这种模式的统计方法(在这种情况下清晰可见)。

我的第一个尝试是将鸟类攻击性的距离矩阵与领土的空间位置相关联。然后申请mantel.test这两个矩阵的相似性。mantel.test然而,这并没有奏效,因为无法吸收有关低侵略领土集群空间隔离的信息。它预计,如果低攻击性的鸟类聚集在一起,它们将聚集在一个大集群中(而不是从图中可见的四个不同的集群中)。因此mantel.test无法证实或反驳侵略对领土空间分布影响的假设。

3. 我已经通知了四个集群彼此不知道,由于它们之间的距离较远,所以我尝试了不同的方法。

我再次制作了所有领土的距离矩阵......

geo.dist<-dist(cbind(x_coor, y_coor))
geo.dist<-as.matrix(geo.dist)

...但我通过设置距离阈值(手动设置为 3 个距离单位)只保留最近邻居的距离

geo.dist[geo.dist > 3] <- NA

这会在每个区域周围创建虚构的圆圈,我能够计算每个区域的邻居数量。

no.neighbours<-numeric(ncol(geo.dist))
for (i in 1:ncol(geo.dist))
no.neighbours[i]<-sum(!is.na(geo.dist[ ,i]))-1

正如你从这个情节中看到的......

plot(aggression,no.neighbours,col = my.data$Col, pch=20)

邻居数量与攻击性之间存在明显的负相关。

cor.test(aggression, no.neighbours)

使用这些步骤来证实(或证伪)这个假设是否正确?(“鸟类的侵略影响领土的位置”)有没有人知道一些更合适的解决方案或这些问题的常用测试名称?

1个回答

Moran's I能够测试数据中是否存在空间相关性。换句话说,它可以回答三种假设

1: 具有相似值的点(具有相似性格的鸟类)彼此接近吗?

在这种情况下是p 值<0.05Moran.I$observed将是

2: 具有相似值的点彼此距离更远吗?(就像棋盘模式,邻居有相反的价值)

在这种情况下也是p-value<0.05Moran.I$observed将是 负数

3: 数据中存在随机模式(无空间相关性)

在这种情况下,p 值>0.05

计算:

library(ape)
# matrix of all distances...
my.dists <- as.matrix(dist(cbind(my.data$x_coor, my.data$y_coor)))
# ...which is inversed...
my.dists.inv <- 1/my.dists
# ...and their diagonals set to "0"
diag(my.dists.inv) <- 0

# than inserted into Moran.I with tested variable
Moran.I(my.data$aggression, my.dists.inv)

结果: Moran's I 揭示了点之间的正空间相关性

非常感谢安迪 W