2009-06-17 10 views
3

Ich habe über 100M Wert/Anzahl Paare in einer Textdatei auf meinem Linux-Rechner. Ich würde gerne herausfinden, welche Art von Formel ich verwenden würde, um mehr Paare zu generieren, die der gleichen Verteilung folgen.Bestimmen der Verteilung, damit ich Testdaten generieren kann

Von einer flüchtigen Inspektion, sieht es Power-Gesetz-ish, aber ich muss ein bisschen strenger als das sein. Kann R das leicht machen? Wenn das so ist, wie? Gibt es noch etwas, das besser funktioniert?

Antwort

4

Während ein wenig teuer, können Sie die Verteilung Ihrer Probe genau nachahmen (ohne irgendeine Hypothese über die zugrunde liegende Bevölkerungsverteilung zu benötigen), wie folgt.

Sie benötigen eine Dateistruktur, die schnell nach "höchster Eintrag mit Schlüssel < = X" durchsucht werden kann - Sleepycats Berkeley-Datenbank hat zum Beispiel eine btree-Struktur; SQLite ist sogar einfacher, wenn auch nicht ganz so schnell (aber mit einem Index auf den Schlüssel sollte es OK sein).

Setzen Sie Ihre Daten in Form von Paaren, wobei der Schlüssel die kumulative Zählung bis zu diesem Punkt ist (sortiert nach steigendem Wert). Nennen Sie K den höchsten Schlüssel.

Um ein Zufallspaar zu generieren, das genau der gleichen Verteilung wie das Sample folgt, generieren Sie eine zufällige Ganzzahl X zwischen 0 und K und suchen Sie in der Dateistruktur nach dem höchsten Wert < = und verwenden Sie den entsprechenden Wert .

Nicht sicher, wie das alles in R zu tun - in Ihren Schuhen würde ich versuchen, eine Python/R-Brücke, die Logik und Kontrolle in Python und nur die Statistiken in R selbst, aber, das ist eine persönliche Entscheidung!

+0

+1 So einfach wie schön: Warum beschränken Sie sich auf ideale Darstellungen, wenn ein Computer es Ihnen erlaubt, die Realität selbst zu haben? – Jaime

4

Um zu sehen, ob Sie eine echte Potenzgesetzverteilung haben, erstellen Sie eine logarithmische Darstellung der Häufigkeiten und sehen Sie, ob sie ungefähr auf einer geraden Linie liegen. Wenn Sie eine gerade Linie haben, sollten Sie diesen Artikel auf der Pareto distribution lesen, um mehr über die Beschreibung Ihrer Daten zu erfahren.

1

Ich nehme an, dass Sie daran interessiert sind, die Verteilung über Ihre kategorischen Werte zu verstehen.

Der beste Weg, um "neue" Daten zu generieren, besteht darin, aus Ihren vorhandenen Daten mit der Funktion s sample() von R zu ermitteln. Dadurch erhalten Sie Werte, die der Wahrscheinlichkeitsverteilung folgen, die von Ihren vorhandenen Zählungen angegeben wird.

ein triviales Beispiel zu geben, nehmen wir an, Sie für eine kleine Stadt, eine Datei von Wählerdaten hatte, wo die Werte politische Einstellung der Wähler sind, und zählt, sind Anzahl der Wähler:

affils <- as.factor(c('democrat','republican','independent')) 
counts <- c(552,431,27) 
## Simulate 20 new voters, sampling from affiliation distribution 
new.voters <- sample(affils,20, replace=TRUE,prob=counts) 
new.counts <- table(new.voters) 

In der Praxis Sie werden wahrscheinlich Ihre 100m Zeilen von Werten und Zählern mit der Funktion read.csv() von R einbringen. Angenommen, Sie haben eine Kopfzeile bekam mit „Werte \ t zählt“, dass Code wie folgt aussehen könnte:

dat <- read.csv('values-counts.txt',sep="\t",colClasses=c('factor','numeric')) 
new.dat <- sample(dat$values,100,replace=TRUE,prob=dat$counts) 

Ein Nachteil: wie Sie vielleicht wissen, hält R alle seine Objekte im Speicher, so sein Sicher, Sie haben genug Freiraum für 100m Reihen von Daten (das Speichern von Zeichenketten als Faktoren wird dazu beitragen, den Footprint zu reduzieren).

Verwandte Themen