Korrelation funktioniert nicht
Moderator: jogo
-
- Beiträge: 78
- Registriert: Fr Dez 08, 2017 6:42 am
Korrelation funktioniert nicht
Hallo ,
ich habe mehrere neue Variablen gebildet und will nun eine Korrelationsmatrix haben. Die neuen Variablen hab ich zentriert. Objektklasse numeric.
ich habe die 4 neuen Variablen als Subddatensatz zusammen gefasst dat2
dat2 <- subset(dat, select = c(Heile_Sum_cen, Spass_Sum_cen, Sicher_Sum_cen, Macht_Sum_cen))
cor(dat2)
Leider gibt er nur eine 1 in der Diagonalen aus und bei allen anderen ein N.A. Was hab ich falsche gemacht?
Wäre für Hinweise dankbar.
Grüße und schöne Weihnachten. Martin
ich habe mehrere neue Variablen gebildet und will nun eine Korrelationsmatrix haben. Die neuen Variablen hab ich zentriert. Objektklasse numeric.
ich habe die 4 neuen Variablen als Subddatensatz zusammen gefasst dat2
dat2 <- subset(dat, select = c(Heile_Sum_cen, Spass_Sum_cen, Sicher_Sum_cen, Macht_Sum_cen))
cor(dat2)
Leider gibt er nur eine 1 in der Diagonalen aus und bei allen anderen ein N.A. Was hab ich falsche gemacht?
Wäre für Hinweise dankbar.
Grüße und schöne Weihnachten. Martin
Re: Korrelation funktioniert nicht
Hallo Martin,
ich meine es liegt an den Daten (..., die Du uns nicht zeigst).
Deshalb auch keine bessere Antwort von mir.
Frohe Weihnachten!
Jörg
ich meine es liegt an den Daten (..., die Du uns nicht zeigst).
Deshalb auch keine bessere Antwort von mir.
Frohe Weihnachten!
Jörg
-
- Beiträge: 78
- Registriert: Fr Dez 08, 2017 6:42 am
Re: Korrelation funktioniert nicht
hier der Datensatz
- Dateianhänge
-
- Daten_bereinigt_ohne_text.csv
- (95.98 KiB) 134-mal heruntergeladen
Re: Korrelation funktioniert nicht
Ich vermute NAs in den Daten, siehe "use=" Argument für Möglichkeiten damit umzugehen.
Schönes Weihnachtsfest,
Schönes Weihnachtsfest,
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Korrelation funktioniert nicht
Hi farngarten,
unterkühlte Antworten an Heiligabend? Bei einer anderen Frage hatte ich Dir geschrieben:
Ich bastle mir also mein funktionierende Minimalbeispiel zu Deinen Daten wie folgt selbst:
Und da funktioniert alles wunderbar bis auf die Variable "c_0001_t1" und eine Warnmeldung. Ich könnte mir die Warnmeldung mit anschauen, aber das ist für Warmduscher. Also schaue ich, was mit dieser Variablen los ist:
Und schon ist klar, warum da keine Korrellaion berechnet werden kann. Tipp: NAs sind es diesmal nicht.
Ich wünsche Dir noch schöne Feiertage,
Bernhard
unterkühlte Antworten an Heiligabend? Bei einer anderen Frage hatte ich Dir geschrieben:
und jetzt textest Du irgendwas über Zentrierung, was für die Korrelation keine Bedeutung hat und schickst mit einem knappendann bitte den Code auf das für die Fragestellung notwendige einkürzen und hier posten, gemeinsam mit ein paar Beispieldaten, auf die man den Code anwenden kann
eine Datei mit 258 Spalten, die auf den ersten Blick alle nicht so heißen, wie in Deinem Code-Schnipsel, welches nicht einmal in Code-Tags steht?
Ich bastle mir also mein funktionierende Minimalbeispiel zu Deinen Daten wie folgt selbst:
Code: Alles auswählen
daten <- read.csv2("http://forum.r-statistik.de/download/file.php?id=206")
dat2 <- subset(daten, select = c("duration_t1", "c_0001_t1", "cd_5_9_t1",
"cd_5_10_t1", "Geschlecht_t1", "Alter_t1"))
cor(dat2)
Code: Alles auswählen
warnings()
Code: Alles auswählen
summary(dat2$c_0001_t1)
Ich wünsche Dir noch schöne Feiertage,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Korrelation funktioniert nicht
Ohne mir die Daten anzuschauen (bin da nicht so motiviert wie du) :Tipp: NAs sind es diesmal nicht.
Varianz = 0?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Korrelation funktioniert nicht
@Eduard Deine Glaskugel ist immer noch 1a. Aber kannst Du damit auch vorhersagen, ob das nur das Problem im vorgelegten Datensatz, oder auch das Problem im relevanten Datensatz, ist?
LG,
Bernhard
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
-
- Beiträge: 78
- Registriert: Fr Dez 08, 2017 6:42 am
Re: Korrelation funktioniert nicht
Hallo an alle,
wenn meine Posts unhöflich oder patzig erscheinen, tut es mir sehr leid.
Ich entschuldige mich dafür.
Vielleicht könnt ihr bei Euren Reaktionen in Betracht ziehen, dass es auch Anfänger gibt?
Ich arbeite mich seit 2 Monaten mühsam in R ein.
Wenn ich zunächst keinen Datensatz mitschickte, geschieht es nicht aus Unfreundlichkeit sondern Unwissenheit.
Wenn ich dann den Datensatz schicke, ohne Variablennamen zu erklären, ist es, weil mir die Notwendigkeit nicht bewusst war.
Weder mit dem Hinweis von Edi zu Anfang ("use=" Argument) noch mit dem Tipp von Bernhard kann ich was anfangen. Ich weiß nicht,
was ein Code-Tag ist.
Und dafür, dass ich zentriere und Korrelationen testen will, entschuldige ich mich ebenfalls. Ich mache die Sachen,
um mich auszuprobieren und erste eigene Schritte gehen zu können. Es tut mir leid, dass ich nicht präsent habe,
dass das Eine für das Andere irrelevant ist.
Grüße Martin
wenn meine Posts unhöflich oder patzig erscheinen, tut es mir sehr leid.
Ich entschuldige mich dafür.
Vielleicht könnt ihr bei Euren Reaktionen in Betracht ziehen, dass es auch Anfänger gibt?
Ich arbeite mich seit 2 Monaten mühsam in R ein.
Wenn ich zunächst keinen Datensatz mitschickte, geschieht es nicht aus Unfreundlichkeit sondern Unwissenheit.
Wenn ich dann den Datensatz schicke, ohne Variablennamen zu erklären, ist es, weil mir die Notwendigkeit nicht bewusst war.
Weder mit dem Hinweis von Edi zu Anfang ("use=" Argument) noch mit dem Tipp von Bernhard kann ich was anfangen. Ich weiß nicht,
was ein Code-Tag ist.
Und dafür, dass ich zentriere und Korrelationen testen will, entschuldige ich mich ebenfalls. Ich mache die Sachen,
um mich auszuprobieren und erste eigene Schritte gehen zu können. Es tut mir leid, dass ich nicht präsent habe,
dass das Eine für das Andere irrelevant ist.
Grüße Martin
Re: Korrelation funktioniert nicht
Hallo farngarten,
Das sind bestimmt sinnvoll investierte Mühen, denn R wirst Du langfristig für die verschiedensten Anwendungsmöglichkeiten nutzen können. Wir können aber nicht wissen, was Du in den 2 Monaten schon gelernt hast, und was nicht. Wenn Du die cor-Funktion nutzt, dann geht EDi davon aus, dass Du weißt, wie man sie nutzt. use = ist ein Argument der Funktion cor und steuert, wie diese sich in Anwesenheit fehlender Daten (NA) verhalten soll. Details dazu gibt es mit Ich nutze R seit vielen Jahren und lerne hier immer neues dazu. Es wird sich nicht vermeiden lassen, dass Du nach nur 2 Monaten Kontakt gelegentlich bei der einen oder anderen Antwort nachfragen musst.
Du brauchst keine Variablennamen zu erklären. Aber wenn Deine Frage sich auf eine Spalte "Heile_Sum_cen" beziehst und so eine Spalte in dem hochgeladenen Datensatz gar nicht drin ist, wie sollen wir dann sagen, wo das Problem in dieser Spalte sitzt?
So, bevor ich jetzt zu meiner Familie zurück gehe, fasse ich unsere Problemanalyse zusammen:
Wenn R keine Korrelationen zwischen Deinen numerischen Variablen berechnen will, liegt das wahrscheinlich entweder daran, dass fehlende Werte (Missings, 'NA') ein Problem sind oder daran, dass eine Spalte immer den gleichen Wert enthält, also die Varianz 0 ist. Du kannst das herauskriegen, indem Du die Funktion summary auf die problematischen Spalten anwendest. Dann wird Dir die Zahl der NA angezeigt und auch, ob alle Werte gleich sind. Sollten die NA das Problem sein, musst Du die Funktion cor mit dem von EDi genannten Argument aufrufen. Solle in der Spalte nur gleiche Werte vorkommen, kann man keine Korrelation ausrechnen. Da kann R nichts für.
Grüße,
Bernhard
Ich glaube, wir ziehen das in Betracht. Du hast am 24.12. und 25.12. mehrere Antworten bekommen, die wahrscheinlich Dein Problem erläutern. Wahrscheinlich und nicht sicher, weil wir raten müssen, wie Deine Daten aussehen.farngarten hat geschrieben: ↑Mo Dez 25, 2017 11:44 amVielleicht könnt ihr bei Euren Reaktionen in Betracht ziehen, dass es auch Anfänger gibt?
Ich arbeite mich seit 2 Monaten mühsam in R ein.
Das sind bestimmt sinnvoll investierte Mühen, denn R wirst Du langfristig für die verschiedensten Anwendungsmöglichkeiten nutzen können. Wir können aber nicht wissen, was Du in den 2 Monaten schon gelernt hast, und was nicht. Wenn Du die cor-Funktion nutzt, dann geht EDi davon aus, dass Du weißt, wie man sie nutzt. use = ist ein Argument der Funktion cor und steuert, wie diese sich in Anwesenheit fehlender Daten (NA) verhalten soll. Details dazu gibt es mit
Code: Alles auswählen
help(cor)
Wenn ich dann den Datensatz schicke, ohne Variablennamen zu erklären, ist es, weil mir die Notwendigkeit nicht bewusst war.
Du brauchst keine Variablennamen zu erklären. Aber wenn Deine Frage sich auf eine Spalte "Heile_Sum_cen" beziehst und so eine Spalte in dem hochgeladenen Datensatz gar nicht drin ist, wie sollen wir dann sagen, wo das Problem in dieser Spalte sitzt?
Zwei gute Gründe nachzufragen. Zu EDis Hinweis habe ich oben was geschrieben. Wenn Dir code-Tags nichts sagen, ist es höchste Zeit, sich mit BBCode zu beschäftigen, beispielsweise hier: https://bbcodes.de/Weder mit dem Hinweis von Edi zu Anfang ("use=" Argument) noch mit dem Tipp von Bernhard kann ich was anfangen. Ich weiß nicht,
was ein Code-Tag ist.
Das ist kein Grund, beleidigt zu sein. Wenn Du hier ankommst und nach der Umsetzung von Korrelationen fragst, gehen wir halt davon aus, dass Du Dich damit auskennst. Wenn das nicht so ist, ist das nicht schlimm. Es ist aber nicht unsere Aufgabe, das zu antizipieren, sondern Deine, bei Bedarf nachzufragen. Korrelationen sind invariant gegenüber linearen Transformationen. Wenn Du also eine von zwei Variablen (oder beide) mit irgendeiner Konstanten multiplizierst oder eine Konstante dazu addierst, dann ändert das nichts an der Korrelation. Zentrieren ist eine lineare Transformation und deshalb für die Korrelation völlig irrelevant.Und dafür, dass ich zentriere und Korrelationen testen will, entschuldige ich mich ebenfalls. Ich mache die Sachen,
um mich auszuprobieren und erste eigene Schritte gehen zu können. Es tut mir leid, dass ich nicht präsent habe,
dass das Eine für das Andere irrelevant ist.
So, bevor ich jetzt zu meiner Familie zurück gehe, fasse ich unsere Problemanalyse zusammen:
Wenn R keine Korrelationen zwischen Deinen numerischen Variablen berechnen will, liegt das wahrscheinlich entweder daran, dass fehlende Werte (Missings, 'NA') ein Problem sind oder daran, dass eine Spalte immer den gleichen Wert enthält, also die Varianz 0 ist. Du kannst das herauskriegen, indem Du die Funktion summary auf die problematischen Spalten anwendest. Dann wird Dir die Zahl der NA angezeigt und auch, ob alle Werte gleich sind. Sollten die NA das Problem sein, musst Du die Funktion cor mit dem von EDi genannten Argument aufrufen. Solle in der Spalte nur gleiche Werte vorkommen, kann man keine Korrelation ausrechnen. Da kann R nichts für.
Grüße,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Korrelation funktioniert nicht
Weder mit dem Hinweis von Edi zu Anfang ("use=" Argument)...
Hier eine Erklärung :
Funktionen haben einen Namen - "cor" in deinem Fall.
Funktionen kann man Eingabewerte übergeben, mit denen sie etwas anstellen. In deinem Fall ist das "dat2", ein Objekt der Klasse "data. frame".
Eingabewerte werden auch "Argumente" genannt und steuern oft auch details wie eine Funktion etwas berechnet. Meist sind Standardwerte vergeben.
Die Funktion cor hat auch einen Rückgabewert, hier die berechnete Korrelationsmatrix.
R hat eine sehr hochwertige Dokumentation/Hilfe die beschreibt wie eine Funktion zu Nutzen ist, was ihre Eingabe und Ausgabewerte sind.
Man erreicht diese Hilfe indem man ein "?" vor den Funktionsnamen setzt:
Code: Alles auswählen
?cor
Code: Alles auswählen
cor {stats}
Correlation, Variance and Covariance (Matrices)
Code: Alles auswählen
Description
var, cov and cor compute the variance of x and the covariance or correlation of x and y if these are vectors. If x and y are matrices then the covariances (or correlations) between the columns of x and the columns of y are computed.
cov2cor scales a covariance matrix into the corresponding correlation matrix efficiently.
Code: Alles auswählen
Usage
var(x, y = NULL, na.rm = FALSE, use)
cov(x, y = NULL, use = "everything",
method = c("pearson", "kendall", "spearman"))
cor(x, y = NULL, use = "everything",
method = c("pearson", "kendall", "spearman"))
cov2cor(V)
Hier sieht man die Funktion, samt aller Argumente und Standard-Eingabewerte. Zum Beispiel ist der Stanardwert für das Argument "na. rm" der Funktion var FALSE.
Code: Alles auswählen
Arguments
x
a numeric vector, matrix or data frame.
y
NULL (default) or a vector, matrix or data frame with compatible dimensions to x. The default is equivalent to y = x (but more efficient).
na.rm
logical. Should missing values be removed?
use
an optional character string giving a method for computing covariances in the presence of missing values. This must be (an abbreviation of) one of the strings "everything", "all.obs", "complete.obs", "na.or.complete", or "pairwise.complete.obs".
method
a character string indicating which correlation coefficient (or covariance) is to be computed. One of "pearson" (default), "kendall", or "spearman": can be abbreviated.
V
symmetric numeric matrix, usually positive definite such as a covariance matrix.
Code: Alles auswählen
Details
For cov and cor one must either give a matrix or data frame for x or give both x and y.
The inputs must be numeric (as determined by is.numeric: logical values are also allowed for historical compatibility): the "kendall" and "spearman" methods make sense for ordered inputs but xtfrm can be used to find a suitable prior transformation to numbers.
var is just another interface to cov, where na.rm is used to determine the default for use when that is unspecified. If na.rm is TRUE then the complete observations (rows) are used (use = "na.or.complete") to compute the variance. Otherwise, by default use = "everything".
If use is "everything", NAs will propagate conceptually, i.e., a resulting value will be NA whenever one of its contributing observations is NA.
If use is "all.obs", then the presence of missing observations will produce an error. If use is "complete.obs" then missing values are handled by casewise deletion (and if there are no complete cases, that gives an error).
"na.or.complete" is the same unless there are no complete cases, that gives NA. Finally, if use has the value "pairwise.complete.obs" then the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables. This can result in covariance or correlation matrices which are not positive semi-definite, as well as NA entries if there are no complete pairs for that pair of variables. For cov and var, "pairwise.complete.obs" only works with the "pearson" method. Note that (the equivalent of) var(double(0), use = *) gives NA for use = "everything" and "na.or.complete", and gives an error in the other cases.
The denominator n - 1 is used which gives an unbiased estimator of the (co)variance for i.i.d. observations. These functions return NA when there is only one observation (whereas S-PLUS has been returning NaN), and fail if x has length zero.
For cor(), if method is "kendall" or "spearman", Kendall's tau or Spearman's rho statistic is used to estimate a rank-based measure of association. These are more robust and have been recommended if the data do not necessarily come from a bivariate normal distribution.
For cov(), a non-Pearson method is unusual but available for the sake of completeness. Note that "spearman" basically computes cor(R(x), R(y)) (or cov(., .)) where R(u) := rank(u, na.last = "keep"). In the case of missing values, the ranks are calculated depending on the value of use, either based on complete observations, or based on pairwise completeness with reranking for each pair.
When there are ties, Kendall's tau_b is computed, as proposed by Kendall (1945).
Scaling a covariance matrix into a correlation one can be achieved in many ways, mathematically most appealing by multiplication with a diagonal matrix from left and right, or more efficiently by using sweep(.., FUN = "/") twice. The cov2cor function is even a bit more efficient, and provided mostly for didactical reasons.
Code: Alles auswählen
Value
For r <- cor(*, use = "all.obs"), it is now guaranteed that all(abs(r) <= 1).
Code: Alles auswählen
Note
Some people have noted that the code for Kendall's tau is slow for very large datasets (many more than 1000 cases). It rarely makes sense to do such a computation, but see function cor.fk in package pcaPP.
Code: Alles auswählen
References
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Kendall, M. G. (1938) A new measure of rank correlation, Biometrika 30, 81–93. https://dx.doi.org/10.1093/biomet/30.1-2.81
Kendall, M. G. (1945) The treatment of ties in rank problems. Biometrika 33 239–251. https://dx.doi.org/10.1093/biomet/33.3.239
Code: Alles auswählen
See Also
cor.test for confidence intervals (and tests).
cov.wt for weighted covariance computation.
sd for standard deviation (vectors).
Code: Alles auswählen
Examples
var(1:10) # 9.166667
var(1:5, 1:5) # 2.5
## Two simple vectors
cor(1:10, 2:11) # == 1
## Correlation Matrix of Multivariate sample:
(Cl <- cor(longley))
## Graphical Correlation Matrix:
symnum(Cl) # highly correlated
## Spearman's rho and Kendall's tau
symnum(clS <- cor(longley, method = "spearman"))
symnum(clK <- cor(longley, method = "kendall"))
## How much do they differ?
i <- lower.tri(Cl)
cor(cbind(P = Cl[i], S = clS[i], K = clK[i]))
## cov2cor() scales a covariance matrix by its diagonal
## to become the correlation matrix.
cov2cor # see the function definition {and learn ..}
stopifnot(all.equal(Cl, cov2cor(cov(longley))),
all.equal(cor(longley, method = "kendall"),
cov2cor(cov(longley, method = "kendall"))))
##--- Missing value treatment:
C1 <- cov(swiss)
range(eigen(C1, only.values = TRUE)$values) # 6.19 1921
## swM := "swiss" with 3 "missing"s :
swM <- swiss
colnames(swM) <- abbreviate(colnames(swiss), min=6)
swM[1,2] <- swM[7,3] <- swM[25,5] <- NA # create 3 "missing"
## Consider all 5 "use" cases :
(C. <- cov(swM)) # use="everything" quite a few NA's in cov.matrix
try(cov(swM, use = "all")) # Error: missing obs...
C2 <- cov(swM, use = "complete")
stopifnot(identical(C2, cov(swM, use = "na.or.complete")))
range(eigen(C2, only.values = TRUE)$values) # 6.46 1930
C3 <- cov(swM, use = "pairwise")
range(eigen(C3, only.values = TRUE)$values) # 6.19 1938
## Kendall's tau doesn't change much:
symnum(Rc <- cor(swM, method = "kendall", use = "complete"))
symnum(Rp <- cor(swM, method = "kendall", use = "pairwise"))
symnum(R. <- cor(swiss, method = "kendall"))
## "pairwise" is closer componentwise,
summary(abs(c(1 - Rp/R.)))
summary(abs(c(1 - Rc/R.)))
## but "complete" is closer in Eigen space:
EV <- function(m) eigen(m, only.values=TRUE)$values
summary(abs(1 - EV(Rp)/EV(R.)) / abs(1 - EV(Rc)/EV(R.)))
Man kann die Beispiele einer Funktion auch mit
Code: Alles auswählen
example(cor)
Ich hoffe du (und alle anderen die hier mitlesen) können nun etwas mit meinem Hinweis anfangen und es hilft dazu die Hilfe richtig zu lesen (hab ich den Studententen immer inder ersten Vorlesung beigebracht) - auch wenn er (leider) nichts zu deinem Problem beiträgt.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.