Inhaltsverzeichnis
2014-06-28 // Matlab: Datenauswertung mit corrcoef() und der Statistics Toolbox
Vor Kurzem stand ich vor der Aufgabe eine große Anzahl an in CSV enthaltenen Daten auszuwerten. Neben der Berechnung der Korrelationsmatrix, der Varianz, des Mittelwerts, des Medians und der Standardabweichung, galt es auch diese Größen als Tabelle in LaTeX zu exportieren. Dazu habe ich eine kleine Matlab Funktion erstellt, die genau diese Aufgabe erfüllt.
Vorarbeit mit LibreOffice und dem CLI
Zunächst habe ich das Rohformat mit LibreOffice Calc grob vorbereitet. Dabei habe ich unter anderem nicht vorhandene Messwerte durch NaN
(Not a Number) ersetzt und nachträglich durch Automatisierung nicht behebbare Probleme „von Hand“ gelöst. Die erste Zeile und Spalte (mit den Titeln/Inhalten) habe ich mit cut
und sed
automatisch entfernt um nachher die Daten in Matlab einfacher einlesen zu können (wäre natürlich auch mit diesen Zeilen/Spalten möglich gewesen). Dazu habe ich folgendes einfache Skript verwendet (hier wurden auch noch die Semikolons durch Kommas ersetzt).
#!/bin/bash READY="../Fertig" for i in *.csv do cat $i | cut -d";" -f2- | sed 1d | sed 's/;/,/g' > ${READY}/${i} done
Auswahl der passenden Funktionen in Matlab
Als nächstes suchte ich mir passende Matlab Funktionen und informierte mich über deren Parameter. Hilfreich ist in diesem Zusammenhang immer die Hilfefunktion (help function_name
).
Import der Daten: csvread()
Die Daten konnte ich in Matlab nun einfach mit csvread()
einlesen. An csvread()
muss nur der Dateiname als String übergeben werden.
>> csvread('test.csv') ans = 1 2 3 4 1 NaN
Berechnung der Korrelationsmatrix: corrcoef()
Sehr wichtig bei der Berechnung der Korrelationsmatrix war es die zuvor eingetragenen NaNs
zu berücksichtigen. Matlab meinte dazu folgendes:
>> help corrcoef corrcoef Correlation coefficients. [...]=corrcoef(...,'PARAM1',VAL1,'PARAM2',VAL2,...) specifies additional parameters and their values. Valid parameters are the following: Parameter Value 'rows' Either 'all' (default) to use all rows, 'complete' to use rows with no NaN values, or 'pairwise' to compute R(i,j) using rows with no NaN values in column i or j. The 'pairwise' option potentially uses different sets of rows to compute different elements of R, and can produce a matrix that is indefinite.
Folglich stand die Funktion corrcoef()
mit den Werten 'complete'
oder 'pairwise'
für den Parameter 'rows'
zur Auswahl. Hier ein kleines Beispiel mit 'complete'
.
>> M=[1:4,NaN;2:2:10;3:3:15] M = 1 2 3 4 NaN 2 4 6 8 10 3 6 9 12 15 >> corrcoef(M) % normal ans = 1 1 1 1 NaN 1 1 1 1 NaN 1 1 1 1 NaN 1 1 1 1 NaN NaN NaN NaN NaN NaN >> corrcoef(M,'rows','complete') % hier dann mit 'rows','complete' ans = 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
Berechnung weitere statistischen Werte: Statistics Toolbox
Für die anderen Größen habe ich jew. die passenden Funktionen der Statistics Toolbox (nanvar
, nanmean()
, nanmedian()
und nanstd()
) verwendet. Diese Funktionen berücksichtigen ebenfalls die NaNs
bei der Berechnung.
>> mean([2;3;NaN]) % "normales" mean ans = NaN % ...kann nicht mit NaNs umgehen >> nanmean([2;3;NaN]) % nanmean ans = 2.5000 % ...hingegen schon
Export der Daten: matrix2latex
Um diese Daten nun in LaTeX Files zu exportieren, habe ich die Funktion matrix2latex von Moritz Koehler verwendet. Eine ausführliche Beschreibung der Parameter findet sich in den Kommentaren der Funktion.
Fertige Matlab Funktion
Im folgenden die fertige Matlab Funktion. Statt fprintf()
kann übrigens auch disp()
verwendet werden.
function [ ] = auswerten( file ) %Funktion zum Auswerten der Daten % Berechnet KorrelationsM, Mittelwert, Median, Standardabweichung und Varianz % und exportiert diese Groessen in 2 LaTeX Tabellen % Daten einlesen fprintf('Daten:\n') M=csvread(file) % Korrelationen berechnen fprintf('Normal:\n') normalC=corrcoef(M) fprintf('Complete:\n') completeC=corrcoef(M,'rows','complete') fprintf('Pairwise:\n') pairwiseC=corrcoef(M,'rows','pairwise') % weitere stat. Werte fprintf('Mean (Mittelwert):\n') meanM=nanmean(M) fprintf('Median:\n') medianM=nanmedian(M) fprintf('Std (Standardabweichung):\n') stdM=nanstd(M) fprintf('Var (Varianz):\n') varM=nanvar(M) % stat. Werte in eine Matrix statM=[meanM; medianM; stdM; varM] % In LaTeX exportieren valDesc={'val1', 'val2', 'val3', 'val4', 'val5'}; statDesc={'Mittelwert', 'Median', 'Standardabweichung', 'Varianz'}; exportC=['../Export/' file '.tex']; exportS=['../Export/' file 'stat.tex']; matrix2latex(completeC, exportC, 'rowLabels', valDesc, 'columnLabels', valDesc, 'alignment', 'c', 'format', '%-6.2f', 'size', 'tiny'); matrix2latex(statM, exportS, 'rowLabels', statDesc, 'columnLabels', valDesc, 'alignment', 'c', 'format', '%-6.2f', 'size', 'tiny'); end
An diese Funktion muss der Dateipfad eines bereits „zurecht geschnittenes“ CSV File als String übergeben werden:
>> auswerten('datei.csv')
Anschließend wird die Datei eingelesen, die Werte berechnet und in zwei LaTeX Tabellen, wovon eine die Korrelationsmatrix und die andere die statistischen Werte enthält, exportiert. Diese Dateien können dann in einem LaTeX Dokument mit \input{}
oder \include{}
eingebunden werden. Falls mehrere Datensätze ausgewertet werden, kann eine weitere Funktion (oder Aufruf) diese Funktion z.B. über eine For-Schleife ausführen.
Comments

Ich korrigiere nochmal, es müsste fprintf(1,'\nöffne und bearbeite %s\n', (files(k).name)); für eine Ausgabe auf der Console heißen:
Hier des Auszug aus der Matlab Doku: count = fprintf(fid,format,A,…) Argument fid is an integer file identifier obtained from fopen. (It can also be 1 for standard output (the screen) or 2 for standard error. See fopen for more information.) Omitting fid causes output to appear on the screen
Leave a comment…
- E-Mail address will not be published.
- Formatting:
//italic// __underlined__
**bold**''preformatted''
- Links:
[[http://example.com]]
[[http://example.com|Link Text]] - Quotation:
> This is a quote. Don't forget the space in front of the text: "> "
- Code:
<code>This is unspecific source code</code>
<code [lang]>This is specifc [lang] code</code>
<code php><?php echo 'example'; ?></code>
Available: html, css, javascript, bash, cpp, … - Lists:
Indent your text by two spaces and use a * for
each unordered list item or a - for ordered ones.
Kleiner Tip für fprintf:
fprintf(0,'\nöffne und bearbeite %s\n', (files(k).name));
1. fid = 0 fprintf(fid
d.h. wenn fid=0 wird auf die normale Ausgabezeile geschrieben. Du kannst aber auch mit fid=fopen('file… eine Datei öffnen und dort reinschreiben. Wenn Du es direkt vorsiehst bist Du universeller…
2. fprintf(0, 'Double: %d, Integer %i, String: %s', vardbl, varint, varstr) Nutze fprintf um direkt die Variablen auszugeben:
3. fprintf(0, 'Double im Format 000.0000: %3.4f', varfloat);