Funktion PcaGrid

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

Antworten
Lisa34

Funktion PcaGrid

Beitrag von Lisa34 »

Hallo ihr Lieben,

ich untersuche im Moment die Funktion PcaGrid.

Vorher habe ich mit der klassischen PCA in R gearbeitet. Jedoch gibt es auch unterbestimmte Matrizen, deren Kovarianzmatrix singulär ist. Nun soll ich diese Funktion untersuchen, welche sich scheinbar einen Gittersuchalgorithmus und S3 und S4 Objekte zunutze macht und auf solche Matrizen anwendbar ist.

Code: Alles auswählen

function (x, k = 0, kmax = ncol(x), scale = FALSE, na.action = na.fail, 
  crit.pca.distances = 0.975, trace = FALSE, ...) 
{
  cl <- match.call()
  if (missing(x)) {
    stop("You have to provide at least some data")
  }
  data <- as.matrix(x)
  n <- nrow(data)
  p <- ncol(data)
  kmax <- max(min(floor(kmax), rankMM(x)), 1)
  if (trace) 
    cat("k=", k, ", kmax=", kmax, ".\n", sep = "")
  if ((k <- floor(k)) < 0) 
    k <- 0
  else if (k > kmax) {
    warning(paste("The number of principal components k = ", 
      k, " is larger then kmax = ", kmax, "; k is set to ", 
      kmax, ".", sep = ""))
    k <- kmax
  }
  if (k != 0) 
    k <- min(k, ncol(data))
  else {
    k <- min(kmax, ncol(data))
    if (trace) 
      cat("The number of principal components is defined by the algorithm. It is set to ", 
        k, ".\n", sep = "")
  }
  if (is.logical(scale)) {
    scale <- if (scale) 
      sd
    else NULL
  }
  out <- PCAgrid(x, k, scale = scale, trace = -1, ...)
  scores <- predict(out)
  center <- out$center
  scale <- out$scale
  sdev <- out$sdev
  scores <- as.matrix(scores[, 1:k])
  loadings <- as.matrix(out$loadings[, 1:k])
  eigenvalues <- (sdev^2)[1:k]
  names(eigenvalues) <- NULL
  if (is.list(dimnames(data))) 
    rownames(scores) <- rownames(data)
  dimnames(scores)[[2]] <- paste("PC", seq_len(ncol(scores)), 
    sep = "")
  dimnames(loadings) <- list(colnames(data), paste("PC", seq_len(ncol(loadings)), 
    sep = ""))
  cl[[1]] <- as.name("PcaGrid")
  res <- new("PcaGrid", call = cl, loadings = loadings, eigenvalues = eigenvalues, 
    center = center, scale = scale, scores = scores, k = k, 
    n.obs = n)
  res <- pca.distances(res, x, p, crit.pca.distances)
  return(res)
}

In den ersten Zeilen werden überwiegend Fehler abgefangen. PcaGrid selbst liefert eine "class" , in denen einzelne Bestandteile wie zB. die Eigenvektoren oder Hauptkomponenten(ich bin mir nicht sicher) in den "loadings" gelistet sind.

Wo wird was berechnet?
Ich sehe kein Vorne und Hinten. Wo genau werden Eigenwerte und -vektoren berechnet?
Was ist der Knackpunkt?
Warum können wir hier jetzt die PCA anwenden? Wodurch legitimiert sich das ganze? Ist das sowas wie eine Approximation?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion PcaGrid

Beitrag von jogo »

Hallo Lisa,

willkommen im Forum!
Aus welchem Paket soll denn die Funktion sein?
In dem Paket https://cran.r-project.org/web/packages/pcaPP/pcaPP.pdf gibt es eine Funktion PCAgrid(), aber das ist ja in R etwas anderes als PcaGrid()

Gruß, Jörg
Lisa34

Re: Funktion PcaGrid

Beitrag von Lisa34 »

Hallo Jörg,

Sorry, das hatte ich nicht erwähnt. Aus dem Paket rrcov.
Aufrufen kann man sie mit View(rrcov:::PcaGrid.default).

Lieben Gruß
Lisa
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion PcaGrid

Beitrag von jogo »

Hallo Lisa,

o.k., hier ist der originale Quelltext:
https://github.com/cran/rrcov/blob/master/R/PcaGrid.R
Das eigentliche Arbeitstier ist pca.distances(res, x, p, crit.pca.distances).
Alles andere sind Vorbereitungen bzw. Arbeiten für die Berücksichtigung spezieller Fälle.

Gruß, Jörg
Lisa34

Re: Funktion PcaGrid

Beitrag von Lisa34 »

Hi Jörg,

ok, ich hab mir den Quelltext mal angeguckt.

Recht interessant finde ich zunächst einmal folgende Stelle:

Code: Alles auswählen

out <- PCAgrid(x, k, scale=scale, trace=-1, ...)

    scores <- predict(out)
Scheinbar wird zunächst einmal die PCA mit der Funktion predict mithilfe der linearen Regression oder der generalisierten angenähert. Das heißt, erstmal haben wir wirklich nur eine Approximation.

Dann kommt:

Code: Alles auswählen

res <- pca.distances(res, x, p, crit.pca.distances)
Ok, schau ich mir die Beschreibung der Funktion an, erleuchtet mich noch nicht wirklich was:

"This function calculates the score and orthogonal distances and the appropriate cutoff values for identifying outlying observations. The computed values are used to create a vector a of flags, one for each observation, identifying the outliers."(R documentation)

Im Grunde genommen muss diese Funktion ja die Approximation sozusagen überschreiben. Wobei ja Außreißer über der crit.pca.distance rausgeschmissen werden(robuste Methode). Was macht sie noch? Entsteht ein Vektor, der orthogonale Abstände zu den Beobachtungen hat? Das ist mittels Gittersuche geschehen?
Mir erschließt sich immer noch nicht, warum wir das hier machen dürfen. Was macht diese Funktion aus, dass diese Unterbestimmheit umgegangen wird? Die Approximation und das Geheimnis von pca.distances?

Ich hab das Gefühl, es fehlt nur noch eine Kleinigkeit, dann verstehe ich das große Ganze :D
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion PcaGrid

Beitrag von jogo »

Die Funktion pca.distances() ist jedenfalls hier definiert:
https://github.com/cran/rrcov/blob/master/R/Pca.R
Dokumentation: https://www.rdocumentation.org/packages ... .distances

Gruß, Jörg
Lisa34

Re: Funktion PcaGrid

Beitrag von Lisa34 »

Ok wow, vor dem Quelltext kapituliere ich :shock:

Vielleicht reicht mein Wissen ja erstmal für die Arbeit.

Falls jemand noch ein paar Worte zu pca.distances verlieren kann/will/möchte, sozusagen umgangssprachlich in anderen Worten nochmal grob was zur Funktionsweise sagen kann, lasst euch nicht aufhalten. ;)

Lieben Gruß an euch
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Funktion PcaGrid

Beitrag von jogo »

Lisa34 hat geschrieben: Do Feb 01, 2018 7:38 pm Ok wow, vor dem Quelltext kapituliere ich :shock:
ja, das haben Arbeitstiere so an sich.
In der Dokumentation ist unten der Verweis auf den beschreibenden Artikel:
https://www.jstatsoft.org/index.php/jss ... v32i03.pdf
So muss man nicht aus dem (evtl. wenig kommentierten) Quelltext analysieren, was dort eigentlich rumgerödelt wird.

Gruß, Jörg
Lisa34

Re: Funktion PcaGrid

Beitrag von Lisa34 »

Hey Jörg,

vielen Dank für all die Verweise.

Das sollte erstmal reichen für die Arbeit.

Lieben Gruß
Lisa
Antworten