Ich arbeite viel mit Proben, die ich auf größere Populationen verallgemeinern möchte. In den meisten Fällen sind die Abtastwerte jedoch vorgespannt und müssen mit dem survey-Paket gewichtet werden. Ich habe jedoch keine Möglichkeit gefunden, Term Document Matrix auf diese Art von Gewichten zu gewichten. Betrachten Sie dieses BeispielVerwenden Sie Gewichte aus Umfrage-Paket in TermDocumentMatrix
library(tm)
library(wordcloud)
set.seed(123)
# Consider this example: I have performed a sample from a population and now have
# 1000 observations of text. In the data I also have information about gender.
# The sample
data <- rbind(data.frame(gender = "M",
words = sample(c("education", "money", "family",
"house", "debts"),
600, replace = TRUE)),
data.frame(gender = "F",
words = sample(c("career", "bank", "friends",
"drinks", "relax"),
400, replace = TRUE)))
# I create a simple wordcloud
text <- paste(data$words, collapse = " ")
matrix <- as.matrix(
TermDocumentMatrix(
VCorpus(
VectorSource(text)
)
)
)
, die eine Wordcloud erzeugt, die etwa wie folgt aussieht:
Wie Sie sehen können, die von den Männern erwähnten Begriffe sind größer, weil die öfter erscheinen. Allerdings kenne ich die wahre Verteilung dieser Population, daher ist diese Wordcloud verzerrt.
Die wahre Geschlechterverteilung
true_gender_dist <- data.frame(gender = c("M", "F"), freq = nrow(data) * c(0.49,0.51))
Mit dem Umfrage-Paket kann ich die Daten mit dem Rechen Funktion gewichten
library(survey)
rake_data <- rake(design = svydesign(ids = ~1, data = data),
sample.margins = list(~gender),
population.margins = list(true_gender_dist))
Um die Gewichte in der Analyse zu verwenden, Visualisierungen usw. (die sind nicht im Umfragepaket enthalten) Ich füge die Gewichtungen zu den Originaldaten hinzu.
data_weighted <- cbind(data, data.frame(weights = weights(rake_data)))
So weit so gut. Allerdings würde ich gerne eine wordcloud machen, die diese Gewichte berücksichtigt.
Mein erster Versuch wäre, die Gewichte bei der Erstellung der Term Document Matrix zu verwenden.
text_corp <- VCorpus(VectorSource(text))
w_tdm <- TermDocumentMatrix(text_corp,
control = list(weighting = weights(rake_data)))
Aber dann bekomme ich:
Error in .TermDocumentMatrix(m, weighting) : invalid weighting
Sie brauchen nicht "Beispiel" für die "Geschlecht" Spalten in Ihrem Beispiel. 'data.frame (Geschlecht = 1, ...'tue –
Sie könnten möglicherweise die [inverse Dokumenthäufigkeit (idf)] (https://en.wikipedia.org/wiki/Tf%E2%80%93idf) verwenden, um den Begriff Frequenzen zu gewichten. Oder teilen Sie die Häufigkeit der Häufigkeit für jedes Geschlecht durch die Anzahl der Umfragen von jedem Geschlecht. – emilliman5
Yeah, @ emilliman5, es war so etwas, woran ich auch dachte. Nur nicht sicher, wie ich es programmieren würde. Vermutlich muss ich mit dem TM-Paket herumprobieren, das eine Funktion zum Spezifizieren von Gewichten hat. Da die Gewichte auch Dinge wie politische Voreingenommenheit, Alter usw. betrachten können, suche ich nach einer ausgefeilteren Methode. – FilipW