WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

gleichverteilte zufällige Stichprobe aus Bevölkerung ziehe

 

Steini
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2018, 10:55     Titel: gleichverteilte zufällige Stichprobe aus Bevölkerung ziehe
  Antworten mit Zitat      
Hallo allerseits,

ich bin neu in Matlab, verzeiht mir daher bitte, falls ich blöde Fragen stelle Smile

Ich habe eine 106x2 Matrix, die meine Bevölkerung nach 106 Altersklassen und 2 Geschlechtern abbildet. (1,1) ist demnach die Anzahl 0 jähriger Männer, (1,2) die 0 jähriger Frauen (2,1) gibt die Anzahl 1 jähriger Männer an usw... Insgesamt sind das so um die 8.3 Millionen Einwohner.

Jetzt will ich eine zufällige, gleichverteilte Stichprobe von n=8300 (0,1% der Bevölkerung) ziehen, stoße dabei aber auf Probleme. Als erstes lässt er mich den randsample(population,n) Befehl nur mit Vektoren, nicht mit Matrizen machen. Dem könnte ich ja noch damit begegnen, die beiden Geschlechtervektoren in einen 212x1 Vektor zusammenzufassen.. Zweitens, bräuchte ich jedoch eine Zufallsziehung aus den 8.3 Millionen, nicht aus den 212 Alters-/Geschlechtskategorien.

Der einzige Ansatz, den ich hatte, war für jeden einzelnen Einwohner eine eigene Reihe zu erstellen, sodass ich quasi einen 8.3Mio x1 Vektor bekomme und aus dem dann mein randsample(8.3mio-vektor, 8300) ziehe. Um dann die gezogene Zahl einem Alter und Geschlecht zuordnen zu können, hätte ich dann die Anzahl in (1,1) ausgelesen und diese, sagen wir 40.000, dann als 'm0' in die ersten 40.000 Reihen meines 8.3 Mio. Vektor geschrieben, die 40.000 in (2,1) als 'm1' in die nächsten 40.000 Reihen usw...

Mal abgesehen davon, dass ich Probleme damit hatte, einen Vektor aufzubauen, der den Wert x aus einem anderen Vektor ausliest und dann eben nacheinander exakt diese x Reihen mit 'm0', 'f0', 'm1' usw. beschriftet, muss es doch einen deutlich eleganteren Lösungsweg geben, oder nicht?? Zumal das ja nur ein Zwischenschritt wäre. Am Ende brauche ich eine Matrix, in der für jedes der 8300 Individuen meiner Stichprobe die verschiedenen Charakteristika (Alter, Geschlecht, Lohn, ...) aufgelistet sind..

Hoffe, ich konnte mein Problem gut darstellen und dass mir jemand einen Tipp geben kann, wie man das eleganter lösen kann.

Grüße
Steini
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.11.2018, 15:24     Titel: Re: gleichverteilte zufällige Stichprobe aus Bevölkerung z
  Antworten mit Zitat      
Hallo Steini,

Ich kann der Erklärung nicht ganz folgen.
Zitat:
Jetzt will ich eine zufällige, gleichverteilte Stichprobe von n=8300 (0,1% der Bevölkerung) ziehen, ...

Bisher hast Du erklärt, dass Du eine Matrix mit 106 Zeilen und 2 Spalten hast. In jeden Element ist die Anzahl der Personen der entsprechenden Altersklasse gespeichert. Von diesen Personen möchtest Du nun 8300 auswählen. Wie sieht Dein Endergebnis aus? Spielt die Unterscheidung nach Männern und Frauen eine Rolle dabei?

Zitat:
Als erstes lässt er mich den randsample(population,n) Befehl nur mit Vektoren, nicht mit Matrizen machen.

Für Diskussionen im Forum ist es besser, Du postest den Code und die Fehlermeldung. "er lässt mich nicht" ist weniger gut nachvollziehbar.
Aber hier ist der Fehler klar: randsample benötigt einen Vektor als Input. Du bekommst damit aber nur Elemente dieses Vektors ausgewählt, während Du ja den Inhalt der Elemente berücksichtigen möchtest.

Zitat:
Der einzige Ansatz, den ich hatte, war für jeden einzelnen Einwohner eine eigene Reihe zu erstellen, sodass ich quasi einen 8.3Mio x1 Vektor bekomme und aus dem dann mein randsample(8.3mio-vektor, 8300) ziehe.

Das klingt gut. Diesen Vektor aufzubauen geht mit repelem sehr zügig.
Code:
V = repelem(1:106, 1, Data(:,1))

Das wäre der Vektor zur ersten Spalte. Für beide Spalten:
Code:
V = repelem(1:numel(Data), 1, Data(:))

Jetzt enthält V am Anfang so viele Einträge mit 1, wie Data(1,1) als Zahl enthält, usw.

Zitat:
und dann eben nacheinander exakt diese x Reihen mit 'm0', 'f0', 'm1' usw. beschriftet,

Über diese "Beschriftung" hast Du bisher noch kein Wort verloren.

Zitat:
muss es doch einen deutlich eleganteren Lösungsweg geben, oder nicht??

Naja, ich finde eine einzelne Zeile Code recht elegant.

Zitat:
Am Ende brauche ich eine Matrix, in der für jedes der 8300 Individuen meiner Stichprobe die verschiedenen Charakteristika (Alter, Geschlecht, Lohn, ...) aufgelistet sind..

Hierzu hast Du wieder noch nichts erklärt. Wo kommen hier die Characteristika her? Bisher hast Du als Inputs nur die 106x2-Matrix beschrieben. Offenbar gibt es aber noch mehr Daten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Steini
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 15.11.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2018, 17:15     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für deine Antwort. Nach 2,5 Tagen Trial and Error hatte ich vorhin endlich einen Durchbruch und wenn ich jetzt sehe, dass es nur noch einige wenige Zeilen im Code sind, fühle ich mich auch ziemlich dämlich, dass ich das gefragt habe, aber ich hatte bis heute echt ein Riesen Brett vor dem Kopf Rolling Eyes Es ist zwar nicht so schön wie deine Lösung mit repelem, aber es wirft die Daten sauber und zuverlässig aus.
Code:

r=randsample(8237666,8328)';
for i=1:8328
    for k=1:213
        %TotalCum beinhaltet die kumulierte Anzahl von Individuen, begonnen
        %mit männlich 0-105 Jahre und anschließend weiblich 0-105 Jahre.
        if r(i)> TotalCum(k)
           Population(i,2)=k-1;
           % k innerhalb der ersten 106 -> männlich (=0)
           if  k<107
            Population(i,1)=0;
            %k innerhalb der zweiten 106 -> weiblich (=1)
           else
            Population(i,1)=1;
            Population(i,2)=k-107;
           end
        end
    end
end
 


Nur vielleicht um dir auch nochmal Feedback zu geben, um was es denn überhaupt geht: ich muss eine Mikrosimulation mit MatLab durchführen. Ziel ist es also am Ende eine Matrix zu haben, in der für jedes Individuum in meiner Stichprobe Geschlecht, Alter, Lohn und Links zu den Indexnummern anderer Einträge (zum Verlinken von Ehepaaren oder Eltern-Kind) zu finden sind. Die sollen dann jedes Jahr gealtert und verschiedenen Eventwahrscheinlichkeiten (z.b. Sterbewahrscheinlichkeit) ausgesetzt werden, um so eine Bevölkerungsprognose und für jeden einzelnen im letzten Schritt dann mithilfe der Einkommen, die über den gesamtem Lebenszyklus erwirtschaftet wurden, die Rentenansprüche ermitteln zu können. Bis dahin ist es aber noch ein langer Weg, ich hoffe, das pack ich irgendwie.. Ich sehe da jetzt schon viele andere Probleme auf mich zukommen.. Bin auch noch nich wirklich sicher, ob ich das nicht lieber in SimuLink machen sollte..
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.