One of the most important features of magclass objects is their auto expansion when used in calculations with other magclass objects: Dimensions of the objects in the calculation are compared and tried to be matched accordingly. Afterwards all objects are expanded in dimensionality to the superset of dimensions involved in the calculation.
This tutorial will go through different variants of this auto expansion logic and explain the differences.
This auto expansion can follow different rules. In magclass version 1 to 4 it was assumed that there is exactly one spatial and one temporal dimension, but various data dimensions (auto expand version 1). Beginning with version 5 of the package this logic has been harmonized and it is now assumed for all main dimensions (spatial, temporal, data) that they consist of more than one subdimension (auto expand version 2). With the updated auto expansion calculation, which previously have led to an error, will now work:
Creating two magpie objects with different world regions:
library(magclass)
#
<- b <- maxample("pop")
a getRegions(b)[1] <- "AAA"
#> Warning: 'getRegions<-' is deprecated.
#> Use 'getItems' instead.
#> See help("Deprecated")
The multiplication for auto expand version 1 (magclass < 5.0) failed, but the same calculation with auto expand version 2.1 (magclass >= 5.0) works:
options(magclass_expand_version = 2.1) # default setting for magclass >= 5.0
head(a * b)
#> An object of class "magpie"
#> , , scenario = A2
#>
#> t
#> i.i1 y1995 y2005 y2015 y2025 y2035 y2045
#> AFR.AAA 305440.1 485028.7 790641.1 1263623.3 1930237.7 2754704
#> AFR.CPA 707763.9 995581.9 1350184.2 1789684.2 2279820.9 2774969
#> AFR.EUR 306419.5 405578.8 527959.5 680390.1 853854.4 1027323
#>
#> , , scenario = B1
#>
#> t
#> i.i1 y1995 y2005 y2015 y2025 y2035 y2045
#> AFR.AAA 305440.1 521067.4 868698.5 1250661.9 1606125.2 1913352.9
#> AFR.CPA 707763.9 1031711.3 1397817.6 1712297.4 1924732.0 2024620.8
#> AFR.EUR 306419.5 423877.5 562607.3 686632.2 785085.5 853625.1
As this modification only changes cases which did not work previously it could be included without causing backwards compatibility issues.
Another way of modifying auto expansion in magclass is the use of set matching. By default dimensions are compared based on their elements: If dimensions are found which contain the same elements it is assumed that it is the same dimension. While this assumption is correct in many cases it fails in some others, e.g. if an import-export matrix should be created. A better way of distinguishing whether dimensions are identical or not is the use of the set names (the names of the dimension). If they are identical it can be assumed that it is the same dimension otherwise it can be assumed that it is not.
Due to the absense of set names in initial versions of magclass the dimension matching was initially implement based on element comparison. With version 5 of the package set matching is now also supported but switched off by default due to backwards compatibility issues. If you want to switch it on (recommended) you can do so by setting the option options(magclass_setMatching=TRUE)
. However, if you do so be prepared that the package behavior will be quite different in many cases as the following examples show:
Without set matching, identical set elements but different set names produce a simple entity matching without expansion:
options(magclass_expand_version = 2.1) # default setting for magclass >= 5.0
<- b <- maxample("pop")
a
getSets(a)[1] <- "import"
getSets(b)[1] <- "export"
options(magclass_setMatching = FALSE)
head(a * b)
#> An object of class "magpie"
#> , , scenario = A2
#>
#> t
#> import y1995 y2005 y2015 y2025 y2035 y2045
#> AFR 305440.1 485028.7 790641.1 1263623.3 1930237.7 2754703.6
#> CPA 1640026.0 2043556.1 2305720.7 2534750.5 2692716.7 2795383.2
#> EUR 307402.0 339143.2 352550.9 366351.8 377708.6 383123.8
#>
#> , , scenario = B1
#>
#> t
#> import y1995 y2005 y2015 y2025 y2035 y2045
#> AFR 305440.1 521067.4 868698.5 1250661.9 1606125.2 1913352.9
#> CPA 1640026.0 2042784.2 2249220.0 2344328.4 2306540.8 2142359.3
#> EUR 307402.0 344815.6 364369.2 376971.4 383755.4 380837.1
With set matching the same calculation will expand the spatial dimension to a cross product of each region with each other:
options(magclass_setMatching = TRUE)
head(a * b)
#> An object of class "magpie"
#> , , scenario = A2
#>
#> t
#> import.export y1995 y2005 y2015 y2025 y2035 y2045
#> AFR.AFR 305440.1 485028.7 790641.1 1263623.3 1930237.7 2754704
#> AFR.CPA 707763.9 995581.9 1350184.2 1789684.2 2279820.9 2774969
#> AFR.EUR 306419.5 405578.8 527959.5 680390.1 853854.4 1027323
#>
#> , , scenario = B1
#>
#> t
#> import.export y1995 y2005 y2015 y2025 y2035 y2045
#> AFR.AFR 305440.1 521067.4 868698.5 1250661.9 1606125.2 1913352.9
#> AFR.CPA 707763.9 1031711.3 1397817.6 1712297.4 1924732.0 2024620.8
#> AFR.EUR 306419.5 423877.5 562607.3 686632.2 785085.5 853625.1
If the set elements are different but the set names identical this will lead to an expansion of the spatial dimension in the case without set matching (as the set name is just ignored):
options(magclass_expand_version = 2.1) # default setting for magclass >= 5.0
<- b <- maxample("pop")
a
getRegions(a)[1] <- "AAA"
#> Warning: 'getRegions<-' is deprecated.
#> Use 'getItems' instead.
#> See help("Deprecated")
getRegions(b)[1] <- "BBB"
#> Warning: 'getRegions<-' is deprecated.
#> Use 'getItems' instead.
#> See help("Deprecated")
options(magclass_setMatching = FALSE)
head(a * b)
#> An object of class "magpie"
#> , , scenario = A2
#>
#> t
#> i.i1 y1995 y2005 y2015 y2025 y2035 y2045
#> AAA.BBB 305440.1 485028.7 790641.1 1263623.3 1930237.7 2754704
#> AAA.CPA 707763.9 995581.9 1350184.2 1789684.2 2279820.9 2774969
#> AAA.EUR 306419.5 405578.8 527959.5 680390.1 853854.4 1027323
#>
#> , , scenario = B1
#>
#> t
#> i.i1 y1995 y2005 y2015 y2025 y2035 y2045
#> AAA.BBB 305440.1 521067.4 868698.5 1250661.9 1606125.2 1913352.9
#> AAA.CPA 707763.9 1031711.3 1397817.6 1712297.4 1924732.0 2024620.8
#> AAA.EUR 306419.5 423877.5 562607.3 686632.2 785085.5 853625.1
With set matching it will return an error as identical set names but differing elements indicates most likely an error.
options(magclass_setMatching = TRUE)
head(a * b)
#> Error in magpie_expand_dim(x, ref, dim = i): Identical set names but different content. Correct set names!
To ensure that existing calculations continue to work as they did before use options(magclass_setMatching=FALSE)
, to write new code more consistently with magclass objects use options(magclass_setMatching=TRUE)
.