// 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

Freddy
No. 1 @ 2015/03/02 15:50

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);

Christoph Winkler
No. 2 @ 2015/03/02 22:22

@Freddy: Vielen Dank für den Tip ;-)

Freddy
No. 3 @ 2015/03/03 08:57

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.
Hello World!

This is the personal website of Christoph Winkler.
Here you will find a sort of blog and some information about me and my projectshave fun!

Recent Comments
Latest Tweets
QR-Code: aktuelle Seiten-URL
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported