最小最大归一化空间矩阵
min-max-normalized spatial matrix
我有一个 NT-by-NT 空间权重矩阵 W.
M <- structure(c(0, 0.758047801675275, 0.555288888514042, 0.209772803587839,
+ 0.825744792120531, 0.520467817084864, 0, 0, 0, 0, 0, 0, 0.692437210353091,
+ 0, 0.354484270326793, 0.80074916779995, 0.848316900897771, 0.695333346258849,
+ 0, 0, 0, 0, 0, 0, 0.677255709888414, 0.873691915767267, 0, 0.708033675095066,
+ 0.888929328881204, 0.467107815435156, 0, 0, 0, 0, 0, 0, 0.374244809383526,
+ 0.926736373687163, 0.544780574040487, 0, 0.917211670428514, 0.621895979624242,
+ 0, 0, 0, 0, 0, 0, 0.480277524562553, 0.635059213498607, 0.0919311880134046,
+ 0.477121754549444, 0, 0.493061222601682, 0, 0, 0, 0, 0, 0, 0.314904219238088,
+ 0.672063720179722, 0.145067517179996, 0.458456297870725, 0.218960420461372,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0798218175768852,
+ 0.174890895141289, 0.392556173028424, 0.174170999322087, 0.298141353996471,
+ 0, 0, 0, 0, 0, 0, 0.432126187486574, 0, 0.259547058260068, 0.951727145817131,
+ 0.278473319951445, 0.815745891304687, 0, 0, 0, 0, 0, 0, 0.324105946579948,
+ 0.222478206269443, 0, 0.93699982133694, 0.671706119552255, 0.864175561117008,
+ 0, 0, 0, 0, 0, 0, 0.322997786104679, 0.347434559138492, 0.663829872850329,
+ 0, 0.493878246517852, 0.648762248922139, 0, 0, 0, 0, 0, 0, 0.00411964254453778,
+ 0.100459286244586, 0.411819625180215, 0.174726587720215, 0, 0.952555304858834,
+ 0, 0, 0, 0, 0, 0, 0.7309863534756, 0.774238996906206, 0.356305604567751,
+ 0.160813542082906, 0.486538449767977, 0), .Dim = c(12L, 12L), .Dimnames = list(
+ c("id1t1", "id2t1", "id3t1", "id4t1", "id5t1", "id6t1", "id1t2",
+ "id2t2", "id3t2", "id4t2", "id5t2", "id6t2"), c("id1t1",
+ "id2t1", "id3t1", "id4t1", "id5t1", "id6t1", "id1t2", "id2t2",
+ "id3t2", "id4t2", "id5t2", "id6t2")))
矩阵看起来像这样
M
id1t1 id2t1 id3t1 id4t1 id5t1 id6t1 id1t2 id2t2 id3t2 id4t2 id5t2 id6t2
id1t1 0.0000000 0.6924372 0.6772557 0.3742448 0.48027752 0.3149042 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id2t1 0.7580478 0.0000000 0.8736919 0.9267364 0.63505921 0.6720637 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id3t1 0.5552889 0.3544843 0.0000000 0.5447806 0.09193119 0.1450675 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id4t1 0.2097728 0.8007492 0.7080337 0.0000000 0.47712175 0.4584563 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id5t1 0.8257448 0.8483169 0.8889293 0.9172117 0.00000000 0.2189604 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id6t1 0.5204678 0.6953333 0.4671078 0.6218960 0.49306122 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id1t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.00000000 0.4321262 0.3241059 0.3229978 0.004119643 0.7309864
id2t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.07982182 0.0000000 0.2224782 0.3474346 0.100459286 0.7742390
id3t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.17489090 0.2595471 0.0000000 0.6638299 0.411819625 0.3563056
id4t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.39255617 0.9517271 0.9369998 0.0000000 0.174726588 0.1608135
id5t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.17417100 0.2784733 0.6717061 0.4938782 0.000000000 0.4865384
id6t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.29814135 0.8157459 0.8641756 0.6487622 0.952555305 0.0000000
其中相同 ids W (id1t1,id1t1) 之间的空间权重设置为 0(在对角线上)。
请注意,空间矩阵包括两个时间段:id1t1 到 id6t1 是时间 t=1 时对象之间的连接,而 id1t2 到 id1t2 表示时间 t=2 时对象之间的连接。
我的目标是创建一个 minmax-normalized 空间矩阵。
为此,我需要将矩阵的每个单元格除以 m,定义如下:
其中maxi(ri)是W的最大行和,maxi(ci)是W的最大列和。
有谁知道是否有执行此操作的程序包?否则有谁知道我如何手动执行此操作?
非常感谢您的帮助!
您可以使用 romSums
和 colSums
:
min(max(rowSums(M)),max(colSums(M)))
[1] 3.615018
速度比较:
microbenchmark::microbenchmark(
min(max(rowSums(M)),max(colSums(M))),
fmin(c(fmax(dapply(M, fsum)), fmax(dapply(M, fsum, MARGIN = 1))))
)
Unit: microseconds
expr min lq mean median uq max neval cld
min(max(rowSums(M)), max(colSums(M))) 6.4 7.15 12.567 8.05 9.20 90.4 100 a
fmin(c(fmax(dapply(M, fsum)), fmax(dapply(M, fsum, MARGIN = 1)))) 103.2 114.70 175.225 142.55 204.45 1499.5 100 b
我们可以使用collapse
library(collapse)
fmin(c(fmax(dapply(M, fsum)), fmax(dapply(M, fsum, MARGIN = 1))))
#[1] 3.615018
我有一个 NT-by-NT 空间权重矩阵 W.
M <- structure(c(0, 0.758047801675275, 0.555288888514042, 0.209772803587839,
+ 0.825744792120531, 0.520467817084864, 0, 0, 0, 0, 0, 0, 0.692437210353091,
+ 0, 0.354484270326793, 0.80074916779995, 0.848316900897771, 0.695333346258849,
+ 0, 0, 0, 0, 0, 0, 0.677255709888414, 0.873691915767267, 0, 0.708033675095066,
+ 0.888929328881204, 0.467107815435156, 0, 0, 0, 0, 0, 0, 0.374244809383526,
+ 0.926736373687163, 0.544780574040487, 0, 0.917211670428514, 0.621895979624242,
+ 0, 0, 0, 0, 0, 0, 0.480277524562553, 0.635059213498607, 0.0919311880134046,
+ 0.477121754549444, 0, 0.493061222601682, 0, 0, 0, 0, 0, 0, 0.314904219238088,
+ 0.672063720179722, 0.145067517179996, 0.458456297870725, 0.218960420461372,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0798218175768852,
+ 0.174890895141289, 0.392556173028424, 0.174170999322087, 0.298141353996471,
+ 0, 0, 0, 0, 0, 0, 0.432126187486574, 0, 0.259547058260068, 0.951727145817131,
+ 0.278473319951445, 0.815745891304687, 0, 0, 0, 0, 0, 0, 0.324105946579948,
+ 0.222478206269443, 0, 0.93699982133694, 0.671706119552255, 0.864175561117008,
+ 0, 0, 0, 0, 0, 0, 0.322997786104679, 0.347434559138492, 0.663829872850329,
+ 0, 0.493878246517852, 0.648762248922139, 0, 0, 0, 0, 0, 0, 0.00411964254453778,
+ 0.100459286244586, 0.411819625180215, 0.174726587720215, 0, 0.952555304858834,
+ 0, 0, 0, 0, 0, 0, 0.7309863534756, 0.774238996906206, 0.356305604567751,
+ 0.160813542082906, 0.486538449767977, 0), .Dim = c(12L, 12L), .Dimnames = list(
+ c("id1t1", "id2t1", "id3t1", "id4t1", "id5t1", "id6t1", "id1t2",
+ "id2t2", "id3t2", "id4t2", "id5t2", "id6t2"), c("id1t1",
+ "id2t1", "id3t1", "id4t1", "id5t1", "id6t1", "id1t2", "id2t2",
+ "id3t2", "id4t2", "id5t2", "id6t2")))
矩阵看起来像这样
M
id1t1 id2t1 id3t1 id4t1 id5t1 id6t1 id1t2 id2t2 id3t2 id4t2 id5t2 id6t2
id1t1 0.0000000 0.6924372 0.6772557 0.3742448 0.48027752 0.3149042 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id2t1 0.7580478 0.0000000 0.8736919 0.9267364 0.63505921 0.6720637 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id3t1 0.5552889 0.3544843 0.0000000 0.5447806 0.09193119 0.1450675 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id4t1 0.2097728 0.8007492 0.7080337 0.0000000 0.47712175 0.4584563 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id5t1 0.8257448 0.8483169 0.8889293 0.9172117 0.00000000 0.2189604 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id6t1 0.5204678 0.6953333 0.4671078 0.6218960 0.49306122 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000 0.000000000 0.0000000
id1t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.00000000 0.4321262 0.3241059 0.3229978 0.004119643 0.7309864
id2t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.07982182 0.0000000 0.2224782 0.3474346 0.100459286 0.7742390
id3t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.17489090 0.2595471 0.0000000 0.6638299 0.411819625 0.3563056
id4t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.39255617 0.9517271 0.9369998 0.0000000 0.174726588 0.1608135
id5t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.17417100 0.2784733 0.6717061 0.4938782 0.000000000 0.4865384
id6t2 0.0000000 0.0000000 0.0000000 0.0000000 0.00000000 0.0000000 0.29814135 0.8157459 0.8641756 0.6487622 0.952555305 0.0000000
其中相同 ids W (id1t1,id1t1) 之间的空间权重设置为 0(在对角线上)。
请注意,空间矩阵包括两个时间段:id1t1 到 id6t1 是时间 t=1 时对象之间的连接,而 id1t2 到 id1t2 表示时间 t=2 时对象之间的连接。
我的目标是创建一个 minmax-normalized 空间矩阵。
为此,我需要将矩阵的每个单元格除以 m,定义如下:
其中maxi(ri)是W的最大行和,maxi(ci)是W的最大列和。
有谁知道是否有执行此操作的程序包?否则有谁知道我如何手动执行此操作?
非常感谢您的帮助!
您可以使用 romSums
和 colSums
:
min(max(rowSums(M)),max(colSums(M)))
[1] 3.615018
速度比较:
microbenchmark::microbenchmark(
min(max(rowSums(M)),max(colSums(M))),
fmin(c(fmax(dapply(M, fsum)), fmax(dapply(M, fsum, MARGIN = 1))))
)
Unit: microseconds
expr min lq mean median uq max neval cld
min(max(rowSums(M)), max(colSums(M))) 6.4 7.15 12.567 8.05 9.20 90.4 100 a
fmin(c(fmax(dapply(M, fsum)), fmax(dapply(M, fsum, MARGIN = 1)))) 103.2 114.70 175.225 142.55 204.45 1499.5 100 b
我们可以使用collapse
library(collapse)
fmin(c(fmax(dapply(M, fsum)), fmax(dapply(M, fsum, MARGIN = 1))))
#[1] 3.615018