Zufällige Auswahl von Firmen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
sina2809
Beiträge: 8
Registriert: Mo Aug 31, 2020 1:45 pm

Zufällige Auswahl von Firmen

Beitrag von sina2809 »

Guten Morgen zusammen,

ich habe mal wieder eine Frage für die weitere Bearbeitung meiner Masterarbeit.
Ich habe eine Liste an Unternehmensanleihen, die zwischen 2009 und 2018 von unterschiedlichen Firmen ausgegeben wurden. Es kann hierbei vorkommen, dass eine Firma in einem Jahr mehrere Anleihen emittiert. Um mein Ergebnis nicht zu verfälschen, weil ein unternehmen zu oft in dem Sample auftritt, würde ich gerne nur noch eine Anleihe für jede Firma pro Jahr in meinem Finalen Sample haben. Ich hoffe es kann mir hier jemand weiterhelfen :)

Code: Alles auswählen

## A tibble: 6 x 6
  ISIN_Bond    ISIN         Year  Sic2          IssuedUSD Yield
  <chr>        <chr>        <chr> <chr>             <dbl> <dbl>
1 US88579YAF88 US88579Y1010 2012  Manufacturing    600000 0.645
2 US88579YAH45 US88579Y1010 2014  Manufacturing    325000 0.903
3 US88579YAQ44 US88579Y1010 2015  Manufacturing    500000 0.621
4 US88579YAR27 US88579Y1010 2015  Manufacturing    550000 0.918
5 US88579YAU55 US88579Y1010 2016  Manufacturing    600000 0.437
6 US88579YAV39 US88579Y1010 2016  Manufacturing    650000 0.788
Zum Beispiel möchte ich also Für das Unternehmen in 2015 einen der Beiden Anleihen US88579YAQ44 oder US88579YAR27 des Unternehmens mit der ISIN US88579Y1010 zufällig auswählen. Das selbe für 2016. 2012 und 2014 sollte die einzige Anleihe des Unternehmens weiterhin im Sample bleiben.

Vielen Dank und liebe Grüße,
Sina
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zufällige Auswahl von Firmen

Beitrag von jogo »

Hallo Sina,

Code: Alles auswählen

dat <- read.table(header=TRUE, text=
"     ISIN_Bond    ISIN         Year  Sic2          IssuedUSD Yield
1 US88579YAF88 US88579Y1010 2012  Manufacturing    600000 0.645
2 US88579YAH45 US88579Y1010 2014  Manufacturing    325000 0.903
3 US88579YAQ44 US88579Y1010 2015  Manufacturing    500000 0.621
4 US88579YAR27 US88579Y1010 2015  Manufacturing    550000 0.918
5 US88579YAU55 US88579Y1010 2016  Manufacturing    600000 0.437
6 US88579YAV39 US88579Y1010 2016  Manufacturing    650000 0.788")

L <- split(dat, dat[c("ISIN", "Year")])

sam1 <- function(d) d[sample(1:nrow(d), 1),]
L1 <- lapply(L, sam1)
do.call(rbind, L1)
oder

Code: Alles auswählen

mysample1 <- function(x) if (length(x)==1) x else sample(x, size=1)
L <- split(1:nrow(dat), dat[c("ISIN", "Year")])
dat[sapply(L, mysample1),]
Gruß, Jörg
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zufällige Auswahl von Firmen

Beitrag von Athomas »

Um mein Ergebnis nicht zu verfälschen, ...
Die zufällige Auswahl einer speziellen Anleihe pro Jahr siehst Du nicht als (potentielle) Verfälschung an?
In Deiner "weiteren Bearbeitung" ist es doch wahrscheinlich möglich, die Daten zu gewichten - wäre das nicht der natürlichere Weg?
sina2809
Beiträge: 8
Registriert: Mo Aug 31, 2020 1:45 pm

Re: Zufällige Auswahl von Firmen

Beitrag von sina2809 »

Guten Morgen zusammen,

und entschuldigt die späte Antwort. Vielen Dank euch beiden erstmal.

Bezüglich der Verzerrung, in der Forschung habe ich beide Wege gefunden und ich möchte damit auch beide Wege durchführen. In meinen Robustheitstests teste ich daher meine Regression ohne diese mögliche Verzerrung der Stichprobe aufgrund von mehreren Bonds einer Firma und Jahr.

Liebe Grüße,
Sina
sina2809
Beiträge: 8
Registriert: Mo Aug 31, 2020 1:45 pm

Re: Zufällige Auswahl von Firmen

Beitrag von sina2809 »

Hallo Jörg,

beim Durchführen des letzten Stück Codes
dat[sapply(L, mysample1),]
bekomme ich immer wieder den Fehler ' Fehler in sample.int(length(x), size, replace, prob) :
ungültiges erstes Argument' Weist du zufällig woran das liegen kann? Anstelle einer Tabelle habe ich lediglich meinen Data Frame eingesetzt:

Code: Alles auswählen

SingleBonds <- select(Data_Stat,'ISIN','Year')
sampleBonds <- function(x) if (length(x)==1) x else sample(x, size=1)
L <- split(1:nrow(SingleBonds), SingleBonds[c("ISIN", "Year")])
SingleBonds[sapply(L, sampleBonds),] 
Danke schonmal :)
Sina
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zufällige Auswahl von Firmen

Beitrag von jogo »

Hallo Sina,

bei mir kommt die Fehlermeldung:

Code: Alles auswählen

> SingleBonds <- select(Data_Stat,'ISIN','Year')
Fehler in select(Data_Stat, "ISIN", "Year") : 
  konnte Funktion "select" nicht finden
Benutzt Du irgendwelche zusätzlichen Pakete, die Du bisher nicht erwähnt hast?

Ansonsten läuft bei mir problemlos:

Code: Alles auswählen

Data_Stat <- read.table(header=TRUE, text=
"     ISIN_Bond    ISIN         Year  Sic2          IssuedUSD Yield
1 US88579YAF88 US88579Y1010 2012  Manufacturing    600000 0.645
2 US88579YAH45 US88579Y1010 2014  Manufacturing    325000 0.903
3 US88579YAQ44 US88579Y1010 2015  Manufacturing    500000 0.621
4 US88579YAR27 US88579Y1010 2015  Manufacturing    550000 0.918
5 US88579YAU55 US88579Y1010 2016  Manufacturing    600000 0.437
6 US88579YAV39 US88579Y1010 2016  Manufacturing    650000 0.788")

sampleBonds <- function(x) if (length(x)==1) x else sample(x, size=1)

L <- split(1:nrow(Data_Stat), Data_Stat[c("ISIN", "Year")])
Data_Stat[sapply(L, sampleBonds),] 
Gruß, Jörg
sina2809
Beiträge: 8
Registriert: Mo Aug 31, 2020 1:45 pm

Re: Zufällige Auswahl von Firmen

Beitrag von sina2809 »

Hallo Jörg,

ja ich nutze diverse Pakete, da mein Code insgesamt knapp 900 Zeilen hat, Habe ich nur einen kleinen Ausschnitt geschickt. Unter anderem nutze ich die Folgenden Pakete:
-tidyr
-effects
-corrgram
-GGally
-dplyr
-zoo
-tseries
-data.table
-clubSandwich
-parallel
-stargazer
-car
-caret
-Hmisc
-corrplot
-lmtest
-broom sowie
-multiwayvcov

Damit sollte der Fehler bei select auf jeden Fall behoben werden. Ich habe es gerade nochmal laufen lassen und ich bekomme immer wieder den Fehler angezeigt.

Vielen Dank für deine Bemühungen :)
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zufällige Auswahl von Firmen

Beitrag von jogo »

Hallo Sina,

das sind ganz schön viele Pakete. Ich habe nicht vor, die Pakete alle zu installieren, um den Fehler reproduzieren zu können. Statt dessen habe ich Dir eine andere Variante gegeben (ohne select()), die zu einem gleichwertigen Ergebnis kommt.
(Du kannst anschließend immer noch select() auf das Ergebnis anwenden).
Oder statt Deinem Aufruf von select() kannst Du die Spalten auch mit einfachen Mitteln (base R) auswählen.

Kannst Du bitte mal das Ergebnis von

Code: Alles auswählen

str(Data_Stat)
liefern? Ich vermute, dass es nicht unbedingt ein Dataframe ist.

Irgendwo habe ich auch gelesen, dass man beim gleichzeitigen Einsatz von data.table und dplyr einiges beachten muss.
(Ich weiß nur nicht mehr genau, worum es ging; ohne Gewähr: die Reihenfolge beim Laden der Pakete ist nicht egal.)

Bei mir läuft völlig problemlos:

Code: Alles auswählen

library("dplyr")

Data_Stat <- read.table(header=TRUE, text=
"     ISIN_Bond    ISIN         Year  Sic2          IssuedUSD Yield
1 US88579YAF88 US88579Y1010 2012  Manufacturing    600000 0.645
2 US88579YAH45 US88579Y1010 2014  Manufacturing    325000 0.903
3 US88579YAQ44 US88579Y1010 2015  Manufacturing    500000 0.621
4 US88579YAR27 US88579Y1010 2015  Manufacturing    550000 0.918
5 US88579YAU55 US88579Y1010 2016  Manufacturing    600000 0.437
6 US88579YAV39 US88579Y1010 2016  Manufacturing    650000 0.788")

SingleBonds <- select(Data_Stat,'ISIN','Year')
sampleBonds <- function(x) if (length(x)==1) x else sample(x, size=1)
L <- split(1:nrow(SingleBonds), SingleBonds[c("ISIN", "Year")])
SingleBonds[sapply(L, sampleBonds),] 
Es liegt also nicht an dem von mir gelieferten Code.
In dieser Form muss der Code auch bei Dir laufen in einer frischen R-Session ohne weiter Pakete.
Bitte testen!

Eine weitere Frage wäre, ob es sicher ist, dass Du die richtige Funktion select() aufrufst - also die aus dem Paket dplyr. Eventuell ist es bei Deinen vielen Paketen notwendig, Funktionen per qualifiziertem Namen aufzurufen, also z.B.

Code: Alles auswählen

dplyr::select(...)
... das gilt auch für andere Funktionen - auf alle Fälle für die Funktionen, bei denen es beim Laden der Pakete die Meldung gibt:
The following objects are masked from ‘package:<Paketname>’:
<Funktionsname> ...


Gruß, Jörg
Antworten