Spearman Correlation wiederholt für verschiedene Teile eines data.frames

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

Moderatoren: EDi, jogo

Antworten
Laubsauger

Spearman Correlation wiederholt für verschiedene Teile eines data.frames

Beitrag von Laubsauger »

Die stark reduzierte Form meines Datensatzes sieht folgendermaßen aus:

Code: Alles auswählen

   report_ctry partner_ctry year   MONEY_ex   MONEY_im   WIOT_ex   WIOT_im
1           AT           DE 2002  8.5808372 16.1630741 34.591100 45.201509
2           AT           ES 2002  1.2446250  4.7767391  2.656151  1.816262
3           AT           FR 2002  4.4816485 11.0260916  5.083568  4.733376
4           AT           IT 2002  3.0898398  0.1929551 10.143348  8.083901
5           AT           DE 2003  5.6349645 14.5028460 34.435932 46.410414
6           AT           ES 2003  1.6063861  0.1514109  2.633816  1.974869
7           AT           FR 2003  5.9736713 13.3159089  4.917519  4.586031
8           AT           IT 2003  1.7273679  4.7489207 10.075955  7.980019
9           AT           DE 2004 17.9224117 30.2373377 34.298943 45.947375
10          AT           ES 2004  3.4296986  8.3922485  2.608634  1.872469
11          AT           FR 2004  6.4216556  7.5793763  4.319266  4.657179
12          AT           IT 2004  7.4142497  4.0909515  9.669970  7.809957
13          BE           DE 2002  9.9820546  0.0000000 20.237328 20.692120
14          BE           ES 2002  0.7359349  5.7678236  3.936783  2.832228
15          BE           FR 2002  8.4192416 20.7078779 17.434342 15.367698
16          BE           IT 2002  0.0000000 17.9215481  6.655783  4.421916
17          BE           DE 2003  0.0000000 15.2294935 20.638146 21.085703
18          BE           ES 2003  0.7007664  1.7057427  3.940353  3.140245
19          BE           FR 2003  9.9963343  0.0000000 18.158921 16.020745
20          BE           IT 2003  8.6150366  3.1672175  6.717638  4.511633
21          BE           DE 2004  5.9230610  0.0000000 21.101395 21.400769
22          BE           ES 2004  5.0732147  6.6526799  4.001297  3.063394
23          BE           FR 2004 17.0925231 10.5683422 18.076162 15.840100
24          BE           IT 2004  2.7509869  7.4083929  6.498400  4.421462
Lies: Ich habe da für jedes report_ctry mehrere partner_ctry und dann Daten für mehrere Jahre. Was ich jetzt machen möchte ist die spearman correlation ausrechnen zwischen MONEY_ex und MONEY_im für jede Kombination von report_ctry und year. D.h. Ich möchte die Korrelation zwischen den beiden Variablen für AT im Jahr 2002, für AT im Jahr 2003, für AT im Jahr 2004, für BE im Jahr 2002 etc. Die Ergebnisse sollen jeweils bitte in einem Vektor gespeichert werden.

Die Korrelation an sich ist ja nun nicht so schwierig:

Code: Alles auswählen

 rcorr(df$MONEY_ex, df$MONEY_im, type="spearman")
Ich vermute mal, man muss wieder mal mit lapply und function hantieren. Aber wie so oft ist aller Anfang in R sehr schwer, erst recht wenn man keinen Programmierer-Hintergrund hat.

Später möchte ich dann auch noch andere Sachen machen, z.B. Korrelationsmatrizen für jede Ausprägung von report_ctry. Das läuft ja dann vom Befehl her in dieselbe Richtung, nehme ich mal an.
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Spearman Correlation wiederholt für verschiedene Teile eines data.frames

Beitrag von bigben »

Hi!

Nehmen wir an, Dein Datensatz heißt "daten". Tut das Folgende, was Du willst?

Code: Alles auswählen

by(daten, list(daten$report_ctry, daten$year), function(x) cor(x$MONEY_ex, x$MONEY_im, method = "spearman"))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Laubsauger

Re: Spearman Correlation wiederholt für verschiedene Teile eines data.frames

Beitrag von Laubsauger »

Jau, das sieht schon mal sehr gut aus! :)

Jetzt ist nur noch die Frage, wie ich den Output in ein verwertbares Format speichere. Das folgende funktioniert schonmal nicht:

Code: Alles auswählen

 rank_cors <- by(daten, list(daten$report_ctry, daten$year), function(x) cor(x$MONEY_ex, x$MONEY_im, method = "spearman"))

cor <- data.frame(rank_cors)
Da kriege ich den Fehler "Kann Klasse "by" nicht in data.frame umwandeln".

Ich hätte die entsprechenden Korrelationen halt am Ende gerne in einem data.frame, wo sie wieder den entsprechenden Ländern und Jahren zugeordnet sind.
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Spearman Correlation wiederholt für verschiedene Teile eines data.frames

Beitrag von jogo »

Code: Alles auswählen

rank_cors <- by(daten, list(daten$report_ctry, daten$year), function(x) cor(x$MONEY_ex, x$MONEY_im, method = "spearman"))
unclass(rank_cors)
ansonsten hättest Du auch (wie schon richtig von Dir vermutet) split() und lapply() (bzw. sapply()) anwenden können:

Code: Alles auswählen

L <- split(daten, list(daten$report_ctry, daten$year))
sapply(L, function(x) cor(x$MONEY_ex, x$MONEY_im, method = "spearman"))
Das vermeidet das komische by-Objekt.

Gruß, Jörg
Laubsauger

Re: Spearman Correlation wiederholt für verschiedene Teile eines data.frames

Beitrag von Laubsauger »

Wunderbar, das spuckt weitgehend das aus, was ich brauche. Herzlichen Dank.
Antworten