Kernel density mit weight faktoren berechnen

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
pfischer
Beiträge: 31
Registriert: Mi Mär 29, 2017 5:31 pm

Kernel density mit weight faktoren berechnen

Beitrag von pfischer »

Liebes Forum,
bei der Berechnung eines Datensatzes wende ich die folgede Funktion zur Berechnung der kernel-density Werte mit der option weights pro zeile an.

Code: Alles auswählen

dmode <- function(x) {
    dxapprox <- approxfun(density(x, adjust=2, kernel = c("gaussian"),na.rm = TRUE, weights = df_list_weights))
    dx <- density(x, adjust=2, kernel = c("gaussian"), na.rm = TRUE, weights = df_list_weights)
    #  plot(dx)
    #  points(x, dxapprox(x),col=2)
    #  dx$x[which.max(dx$y)]
    c(kernel_density_value=dx$x[which.max(dx$y)], bandwidth=dx$bw)
  }

 temp <- as.data.frame(t(apply(selected_data[,3:ncol(selected_data)-1], 1, dmode)))
  
Die zu verwendenden "weights" für jeden Wert pro Zeile stehen in der gleichen Reihenfolge in "df_list_weights" wie die Werte selbst im Datensatz "selected_data".

##Als Testdaten habe ich folgende Daten verwendet

Code: Alles auswählen

df_list_weights.1 <- c(0.25,0.1,0.33)
df_list_weights.2 <- c(0.25,0.6,NA)
df_list_weights.3 <- c(NA,0.1,0.33)
df_list_weights.4 <- c(0.25,NA,0.34)
df_list_weights.5 <- c(0.25,0.2,NA)
df_list_weights <- data.frame(df_list_weights.1,df_list_weights.2,df_list_weights.3,df_list_weights.4,df_list_weights.5)


selected_data.1 <- c(1,2,3)
selected_data.2 <- c(3,3,NA)
selected_data.3 <- c(NA,3,7)
selected_data.4 <- c(7,NA,4)
selected_data.5 <- c(2,3,NA)
selected_data <- data.frame(selected_data.1,selected_data.2,selected_data.3,selected_data.4,selected_data.5)
 

Das Skript gibt mir nun den Fehler
"Fehler in density.default(x, adjust = 2, kernel = c("gaussian"), na.rm = TRUE, :
'x' and 'weights' have unequal length"

Ich habe ein paar Tests durchgeführt und gefunden, dass es an den vorhandenen NA-Werten in in "df_list_weight) liegt die wohl, entgegen zum eigentlichen datensatz "selected_data" NICHT über die option na.rm = TRUE im Funktionsaufruf entfernt werden. Wen n ich das bei einem kleinen Datensatz manuell manche, klappt alles prima.




Nun ist es mir aber ein Rätsel wir ich aus dem data.frame df_list_weights die NA's entfernen soll. Ich habe dazu den Versuch gemacht den data.frame mit den beiden codezeilen

Code: Alles auswählen

df_list_weights <- split(df_list_weights, seq(nrow(df_list_weights)))
df_list_weights <- lapply(df_list_weights, function(x) x[!is.na(x)])in 
zunächst in einzelne Listen pro Zeile zu konvertieren und dann die NA's aus den einzelnen Listen zu löschen. Das hat auch geklappt aber die Angaben der entsprechend bereinigten Liste weights=df_list_weights funktioniert auich nicht.

Über jedemn Lösungsvorschlag wäre ich dankbar.

VG Philipp
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Kernel density mit weight faktoren berechnen

Beitrag von EDi »

Was ist mit dem Object dxapprox in der funktion? - Das wird gar nicht verwendet?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Kernel density mit weight faktoren berechnen

Beitrag von EDi »

Habs etwas modifiziert unter der annahmen, dass die spalten von data & weight zusammen gehören?!

Code: Alles auswählen

#'@param x vector
#'@param w vector of weight
dmode <- function(x, w) {
  stopifnot(length(x) == length(w))
  if (!all(which(is.na(x)) == which(is.na(w))))
    stop('NAs not same between x and w')
  x <- x[!is.na(x)]
  w <- w[!is.na(w)]
  # dxapprox <- approxfun(density(x, adjust = 2, kernel = c("gaussian"),  weights = w))
  dx <- density(x, adjust = 2, kernel = c("gaussian"), weights = w)
  c(kernel_density_value = dx$x[which.max(dx$y)], bandwidth = dx$bw)
}

sapply(seq_len(ncol(selected_data)),
               function(x) {
                 dmode(selected_data[ ,x],
                                 df_list_weights[ ,x])
                 })
Es läuft zwar, aber ich hätte vermutlich einen anderen weg gewählt (daten ins lange Formal und gruppenweise abhandeln, anstatt das spaltenweise zu machen. Hat den Vorteil, dass man sicherer und einfacher die beiden Datensätze zusammenhalten kann).
Beachte auch die Warnungen...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten