【问题标题】:Calculate the S1 sum for variance of Moran's I计算 Moran's I 方差的 S1 和
【发布时间】:2021-11-27 16:14:11
【问题描述】:

我想计算Moran's I方差的S1项。以下是计算S1的公式

其中 w_{ij} 是空间权重矩阵中的一个元素。

我的空间权重矩阵如下:-

structure(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0.111111111111111, 0.1, 0.1, 0.166666666666667,
0, 0.1, 0.111111111111111, 0.125, 0.166666666666667, 0, 0, 0.1,
0.111111111111111, 0, 0, 0.166666666666667, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.0909090909090909,
0, 0, 0.1, 0.1, 0.166666666666667, 0, 0.1, 0.111111111111111,
0.125, 0.166666666666667, 0, 0, 0.1, 0, 0, 0, 0, 0, 0, 0.0909090909090909,
0, 0.111111111111111, 0, 0.1, 0, 0, 0.1, 0.111111111111111, 0.125,
0.166666666666667, 0, 0, 0.1, 0.111111111111111, 0, 0, 0.166666666666667,
0, 0, 0.0909090909090909, 0, 0.111111111111111, 0.1, 0, 0, 0.333333333333333,
0.1, 0.111111111111111, 0.125, 0, 0, 0, 0.1, 0.111111111111111,
0, 0, 0.166666666666667, 0, 0, 0.0909090909090909, 0, 0.111111111111111,
0, 0, 0, 0, 0.1, 0.111111111111111, 0, 0.166666666666667, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0.111111111111111, 0, 0, 0.166666666666667, 0, 0, 0.0909090909090909,
0, 0.111111111111111, 0.1, 0.1, 0.166666666666667, 0, 0, 0.111111111111111,
0.125, 0.166666666666667, 0, 0, 0.1, 0.111111111111111, 0, 0,
0, 0, 0, 0.0909090909090909, 0, 0.111111111111111, 0.1, 0.1,
0.166666666666667, 0, 0.1, 0, 0.125, 0, 0, 0, 0.1, 0.111111111111111,
0, 0, 0, 0, 0, 0.0909090909090909, 0, 0.111111111111111, 0.1,
0.1, 0, 0, 0.1, 0.111111111111111, 0, 0, 0, 0, 0.1, 0.111111111111111,
0, 0, 0, 0, 0, 0.0909090909090909, 0, 0.111111111111111, 0.1,
0, 0.166666666666667, 0, 0.1, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0.0909090909090909, 0, 0.111111111111111, 0.1, 0.1, 0, 0, 0.1,
0.111111111111111, 0.125, 0.166666666666667, 0, 0, 0, 0.111111111111111,
0, 0, 0.166666666666667, 0, 0, 0.0909090909090909, 0, 0, 0.1,
0.1, 0, 0.333333333333333, 0.1, 0.111111111111111, 0.125, 0,
0, 0, 0.1, 0, 0, 0, 0.166666666666667, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.166666666666667,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0909090909090909,
0, 0, 0.1, 0.1, 0, 0.333333333333333, 0, 0, 0, 0, 0, 0, 0.1,
0.111111111111111, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(20L, 20L), .Dimnames = list(
    c("AUS", "BEL", "CAN", "CHE", "DEU", "DNK", "ESP", "FIN",
    "FRA", "GBR", "IRL", "ITA", "JPN", "KOR", "NLD", "NOR", "NZL",
    "PRT", "SWE", "USA"), c("AUS", "BEL", "CAN", "CHE", "DEU",
    "DNK", "ESP", "FIN", "FRA", "GBR", "IRL", "ITA", "JPN", "KOR",
    "NLD", "NOR", "NZL", "PRT", "SWE", "USA")))

我可以通过在 for 循环中使用 for 循环来做到这一点,但我认为可能有更有效的方法来做到这一点。也许使用 lapply 或其他东西。

提前致谢。

【问题讨论】:

    标签: r spatial


    【解决方案1】:

    定义一个平方和函数并使用outer

    squared_sum <- function(x, y) (x + y)^2
    sum(outer(W, W, squared_sum))/2
    #[1] 3037.03
    

    【讨论】:

      【解决方案2】:

      对我来说,解决方案是这样的

      set.seed(1)
      m <- matrix(sample(c(0, 1), size = 16, replace = TRUE), nrow = 4) 
      diag(m) <- 0
      m
      #>      [,1] [,2] [,3] [,4]
      #> [1,]    0    1    1    0
      #> [2,]    1    0    1    0
      #> [3,]    0    0    0    0
      #> [4,]    0    0    0    0
      S1 <- 0.5 * sum((m + t(m))^2)
      S1
      #> [1] 6
      

      reprex package (v2.0.1) 于 2021-10-07 创建

      【讨论】:

        【解决方案3】:

        使用expand.grid

        squared_sum <- function(x, y) (x + y)^2
        with(expand.grid(W, W) , sum(squared_sum(Var1, Var2)))/2
        [1] 3037.03
        

        【讨论】:

          猜你喜欢
          • 2017-11-16
          • 1970-01-01
          • 2020-07-25
          • 2021-09-23
          • 1970-01-01
          • 2017-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多