2014-11-23 14 views
6

ich dieses Array:Wie "erholen" ein 3-dimensionales (2 x 2 x 2) Array (ein Würfel) von 3 zweidimensionalen Matrizen (die Würfelflächen)

T <- array(c(.25,.1,.1,.1,.05,.1,.1,.2),c(2,2,2)) 

    # , , 1 
    #  [,1] [,2] 
    # [1,] 0.25 0.1 
    # [2,] 0.10 0.1 

    # , , 2 
    #  [,1] [,2] 
    # [1,] 0.05 0.1 
    # [2,] 0.10 0.2 

ich es annehmen kann als eine Art "Würfel" in der dritten Dimension zu verstehen. Es hat Zeilen (Dimension 1), Spalten (Dim 2) und "Höhe" (Dim 3), sozusagen ...

Jetzt kann ich seine Werte über eine dieser Dimensionen summieren. Es gibt 3 mögliche Kombinationen:

Tm1 <- apply(T0,c(1,2),sum) 
    Tm2 <- apply(T0,c(1,3),sum) 
    Tm3 <- apply(T0,c(2,3),sum) 

Jetzt habe ich dies:

#> Tm1 
    #  [,1] [,2] 
    #[1,] 0.3 0.2 
    #[2,] 0.2 0.3 

    #> Tm2 
    #  [,1] [,2] 
    #[1,] 0.35 0.15 
    #[2,] 0.20 0.30 

    #> Tm3 
    #  [,1] [,2] 
    #[1,] 0.35 0.15 
    #[2,] 0.20 0.30 

Sie sind die Würfel "Gesichter".

Ist es möglich, das ursprüngliche Array aus diesen 3 Matrizen wiederherzustellen?. Mit anderen Worten, ist es möglich, die Verteilung innerhalb dieses "Würfels" zu kennen, indem man einfach seine "Gesichter" betrachtet?

Wenn ja, wie es geht? (Ich meine, die "Algebra Weg" und der R-Algorithmus ...)

+0

Dies ist einem ökologischen Inferenzproblem sehr ähnlich. –

Antwort

4

Hier ist, wie ich eine Lösung für Ihre Frage kam. Erstens bauen das System von Gleichungen, so dass A %*% x = b (wobei x die Werte zu lösen, für, die innerhalb T0):

n <- prod(dim(T0)) 
b <- c(Tm1, Tm2, Tm3) 
m <- length(b) 
Ti <- array(seq_along(T0), dim(T0)) 
Ti1 <- unlist(apply(Ti, c(1,2), list)) 
Ti2 <- unlist(apply(Ti, c(1,3), list)) 
Ti3 <- unlist(apply(Ti, c(2,3), list)) 

A <- matrix(0, nrow = m, ncol = n) 
A[cbind(rep(1:m, each = 2), c(Ti1, Ti2, Ti3))] <- 1 

cbind(A, b) 
#       b 
# [1,] 1 0 0 0 1 0 0 0 0.30 
# [2,] 0 1 0 0 0 1 0 0 0.20 
# [3,] 0 0 1 0 0 0 1 0 0.20 
# [4,] 0 0 0 1 0 0 0 1 0.30 
# [5,] 1 0 1 0 0 0 0 0 0.35 
# [6,] 0 1 0 1 0 0 0 0 0.20 
# [7,] 0 0 0 0 1 0 1 0 0.15 
# [8,] 0 0 0 0 0 1 0 1 0.30 
# [9,] 1 1 0 0 0 0 0 0 0.35 
# [10,] 0 0 1 1 0 0 0 0 0.20 
# [11,] 0 0 0 0 1 1 0 0 0.15 
# [12,] 0 0 0 0 0 0 1 1 0.30 

A ist eine nicht-quadratische Matrix so habe ich eine verallgemeinerte inverse für x zu lösen:

library(MASS) 
xsol <- ginv(A) %*% b 
Tsol <- array(xsol, dim(T0)) 
Tsol 

# , , 1 
# 
#  [,1] [,2] 
# [1,] 0.2375 0.1125 
# [2,] 0.1125 0.0875 
# 
# , , 2 
# 
#  [,1] [,2] 
# [1,] 0.0625 0.0875 
# [2,] 0.0875 0.2125 

Diese Lösung Ihrer ersten T0 nicht übereinstimmen, überprüfen Sie können jedoch, dass

apply(Tsol, c(1,2), sum) 
#  [,1] [,2] 
# [1,] 0.3 0.2 
# [2,] 0.2 0.3 

apply(Tsol, c(1,3), sum) 
#  [,1] [,2] 
# [1,] 0.35 0.15 
# [2,] 0.20 0.30 

apply(Tsol, c(2,3), sum) 
#  [,1] [,2] 
# [1,] 0.35 0.15 
# [2,] 0.20 0.30 

Fazit? Nein, es ist nicht möglich, Ihre ursprüngliche Matrix wiederherzustellen. Ein anderer Weg, um es zu zeigen, ist, dass der Rang qr(A)$rank der A Matrix 7 ist, während Sie 8 unknowns haben. Sie würden also ein zusätzliches Bit an Information benötigen, z.B. dass T[1, 1] ist 0.25 Ihre ursprüngliche Array wiederherzustellen:

A <- rbind(A, c(1, rep(0, n - 1))) 
b <- c(b, 0.25) 
qr(A)$rank 
# [1] 8 
xsol <- ginv(A) %*% b 
Tsol <- array(xsol, dim(T0)) 
Tsol 
# , , 1 

#  [,1] [,2] 
# [1,] 0.25 0.1 
# [2,] 0.10 0.1 

# , , 2 

#  [,1] [,2] 
# [1,] 0.05 0.1 
# [2,] 0.10 0.2 
1

Hier ist eine algebraische Erklärung in einem allgemeineren Fall mit kontinuierlichen Variablen. Das kann helfen, den Grund dafür zu finden, dass Sie das nicht können. Das Problem ist, dass Sie die inverse Karte nicht konstruieren können. Unten können Sie das Integrationszeichen durch Summation ersetzen, versuchen, die inverse Matrix zu finden, und sie erreichen das Ergebnis, das flodel oben gezeigt hat. Nehmen wir an, dass f in die Domäne von x, y und z integrierbar ist. Ihre ursprüngliche Tabelle ist

$$ w = f (x, y, z) $$

Ihre Transformation ist

$$ t (x) = \ int_x f (x, y, z) dx = g (y, z) $$

Sie möchten eine inverse Karte von t (x) zu w haben.Diese Karte wäre

$$ \ frac {\ partielle t (x)} {\ partielle x} = \ frac {\ partielle} {\ partielle x} \ linke (\ int_x f (x, y, z) dx \ rechts) = \ frac {\ partiell} {\ partially x} g (y, z) = 0 $$

Das heißt, sobald Sie x integriert haben, können Sie es nicht von g wiederherstellen (y, z).

+0

Ich habe es ... Die Information über x existiert nicht mehr, also wird die Ableitung nicht umkehren, was durch das Integral gemacht wurde. Aber ich dachte über andere Sache nach: Wenn Sie 3 neue Funktionen erstellen - jede von ihnen durch Integration in Bezug auf eine Variable zu einer Zeit ... Sie hätten 3 "Teilinformationen" über die ursprüngliche Funktion (nicht nur eine , wie in Ihrem Beispiel). Ich habe mich gefragt, ob eine Kombination dieser neuen Funktionen es erlauben würde, den Prozess umzukehren ... Aber die obige Antwort deutet darauf hin, dass dies auch nicht möglich ist. Und die Logik ähnelt der Ihrer Antwort. – RogerioJB