Seite 1 von 1

Kernel density mit weight faktoren berechnen

Verfasst: Sa Nov 24, 2018 4:14 pm
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

Re: Kernel density mit weight faktoren berechnen

Verfasst: Sa Nov 24, 2018 5:56 pm
von EDi
Was ist mit dem Object dxapprox in der funktion? - Das wird gar nicht verwendet?

Re: Kernel density mit weight faktoren berechnen

Verfasst: Sa Nov 24, 2018 6:02 pm
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...