| Reduce0exact | R Documentation |
The linear equation problem, z = t(x) %*% y with y non-negative and x as a design (dummy) matrix,
is reduced to a smaller problem by identifying elements of y that can be found exactly from x and z.
Reduce0exact(
x,
z = NULL,
reduceByColSums = FALSE,
reduceByLeverage = FALSE,
leverageLimit = 0.999999,
digitsRoundWhole = 9,
y = NULL,
yStart = NULL,
printInc = FALSE
)
x |
A matrix |
z |
A single column matrix |
reduceByColSums |
See Details |
reduceByLeverage |
See Details |
leverageLimit |
Limit to determine perfect fit |
digitsRoundWhole |
|
y |
A single column matrix. With |
yStart |
A starting estimate when this function is combined with iterative proportional fitting. Zeros in yStart will be used to reduce the problem. |
printInc |
Printing iteration information to console when TRUE |
Exact elements can be identified in three ways in an iterative manner:
By zeros in z. This is always done.
By columns in x with a singe nonzero value. Done when reduceByColSums or reduceByLeverage is TRUE.
By exact linear regression fit (when leverage is one). Done when reduceByLeverage is TRUE.
The leverages are computed by hat(as.matrix(x), intercept = FALSE), which can be very time and memory consuming.
Furthermore, without y in input, known values will be computed by ginv.
A list of five elements:
x: A reduced version of input x
z: Corresponding reduced z
yKnown: Logical, specifying known values of y
y: A version of y with known values correct and others zero
zSkipped: Logical, specifying omitted columns of x
Øyvind Langsrud
# Make a special data set
d <- SSBtoolsData("sprt_emp")
d$ths_per <- round(d$ths_per)
d <- rbind(d, d)
d$year <- as.character(rep(2014:2019, each = 6))
to0 <- rep(TRUE, 36)
to0[c(6, 14, 17, 18, 25, 27, 30, 34, 36)] <- FALSE
d$ths_per[to0] <- 0
# Values as a single column matrix
y <- Matrix::Matrix(d$ths_per, ncol = 1)
# A model matrix using a special year hierarchy
x <- Hierarchies2ModelMatrix(d, hierarchies = list(geo = "", age = "", year =
c("y1418 = 2014+2015+2016+2017+2018", "y1519 = 2015+2016+2017+2018+2019",
"y151719 = 2015+2017+2019", "yTotal = 2014+2015+2016+2017+2018+2019")),
inputInOutput = FALSE)
# Aggregates
z <- Matrix::t(x) %*% y
sum(z == 0) # 5 zeros
# From zeros in z
a <- Reduce0exact(x, z)
sum(a$yKnown) # 17 zeros in y is known
dim(a$x) # Reduced x, without known y and z with zeros
dim(a$z) # Corresponding reduced z
sum(a$zSkipped) # 5 elements skipped
Matrix::t(a$y) # Just zeros (known are 0 and unknown set to 0)
# It seems that three additional y-values can be found directly from z
sum(Matrix::colSums(a$x) == 1)
# But it is the same element of y (row 18)
a$x[18, Matrix::colSums(a$x) == 1]
# Make use of ones in colSums
a2 <- Reduce0exact(x, z, reduceByColSums = TRUE)
sum(a2$yKnown) # 18 values in y is known
dim(a2$x) # Reduced x
dim(a2$z) # Corresponding reduced z
a2$y[which(a2$yKnown)] # The known values of y (unknown set to 0)
# Six ones in leverage values
# Thus six extra elements in y can be found by linear estimation
hat(as.matrix(a2$x), intercept = FALSE)
# Make use of ones in leverages (hat-values)
a3 <- Reduce0exact(x, z, reduceByLeverage = TRUE)
sum(a3$yKnown) # 26 values in y is known (more than 6 extra)
dim(a3$x) # Reduced x
dim(a3$z) # Corresponding reduced z
a3$y[which(a3$yKnown)] # The known values of y (unknown set to 0)
# More than 6 extra is caused by iteration
# Extra checking of zeros in z after reduction by leverages
# Similar checking performed also after reduction by colSums
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.