Kernel density mit weight faktoren berechnen
Verfasst: Sa Nov 24, 2018 4:14 pm
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.
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
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
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
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)))
##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
Über jedemn Lösungsvorschlag wäre ich dankbar.
VG Philipp