Seite 1 von 2

Matrixmultiplikation

Verfasst: Sa Okt 08, 2016 10:23 am
von tr206
Hallo,

ich versuche eine PCA zu machen und hierzu zwei Vektoren bzw. Matrizen zu multiplizieren. Der code sieht so aus

Code: Alles auswählen

data<-equityfunds[,-1]

PC<-prcomp(data)

coef1<-PC$rotation

data<-as.matrix(data)

PC1<-coef1 %*% data
Leider klappt das nicht und ich verstehe nicht warum.

Das Resultat soll dann ins Excel exportiert werden. Ich habe das so probiert

Code: Alles auswählen

 WriteXLS(coef1,ExcelFileName = "PCAtest.xls")
The Perl script 'WriteXLS.pl' failed to run successfully.
Warning message:
running command 'perl -I"C:/Users/Thorsten/Documents/R/win-library/3.3/WriteXLS/Perl" "C:/Users/Thorsten/Documents/R/win-library/3.3/WriteXLS/Perl/WriteXLS.pl" --CSVPath "C:\Users\Thorsten\AppData\Local\Temp\RtmpAn2KM9/WriteXLS" --verbose FALSE --AdjWidth FALSE --AutoFilter FALSE --BoldHeaderRow FALSE --FreezeRow 0 --FreezeCol 0 --Encoding UTF-8 "C:\Users\Thorsten\Documents\PCAtest.xls"' had status 127 
Leider klappt das ganze nicht. Was mach ich denn falsch?

Vielen Dank vorab.

Re: Matrixmultiplikation

Verfasst: Sa Okt 08, 2016 10:33 am
von jogo
Bei einer Matrixmultiplikation ist die Reihenfolge nicht egal, d.h. das Kommutativgesetz gilt nicht. Selbst wenn die Formate von zwei Matrizen A und B so beschaffen sind, dass man sowohl A %*% B als auch B %*% A bilden kann, bedeutet dass nicht, dass (A %*% B) == (B %*% A)

Code: Alles auswählen

equityfunds <- read.csv2("equityfunds.csv", header=TRUE, dec='.')
data <- equityfunds[,-1]
PC <- prcomp(data)
coef1 <- PC$rotation
PC1 <- as.matrix(data) %*% coef1
Gruß, Jörg

Re: Matrixmultiplikation

Verfasst: Sa Okt 08, 2016 10:35 am
von student
Hallo,

zu R und Excel hast Du einen Hinweis bekommen. Entspricht das Ergebnis der Matrizenmultiplikation Deiner Erwartung (welche hoffentlich dem richtigen Ergebnis entspricht)?

Re: Matrixmultiplikation

Verfasst: Sa Okt 08, 2016 4:18 pm
von tr206
Ja, danke die Multiplikation passt wie ich es wollte.

Aber mit dem Export passt das noch nicht, da ich immer so eine csv Datei bekomme in der die Werte in einer Zeile stehen. Ich will aber die Werte in einer einzelnen Zelle haben, da ich die Werte dann besser in Excel weiter nutzen kann.

Re: Matrixmultiplikation

Verfasst: Sa Okt 08, 2016 4:52 pm
von student
Hallo,

dann bleibt nur aus meiner Sicht write.csv2() und dann die csv-Datei in Deine Excel-Version (Gebietsschema Deutsch) einlesen. Dann brauchst Dur Dir keine Gedanken über das Format zu machen.

Oder Du verwendest das Flaggschiff XLConnect.....

Re: Matrixmultiplikation

Verfasst: So Okt 09, 2016 11:15 am
von tr206
Das klappt ganz gut aber ich bekomme dann so zerrissene Daten, d.h. die Vorkommastelle ist dann in einer anderen Spalte angegeben als die Nachkommastellen (siehe als Beispiel den Anhang). Kann das durch ein weiteres argument in write.csv2() korrigiert werden?

Re: Matrixmultiplikation

Verfasst: So Okt 09, 2016 11:30 am
von jogo
Du kannst beim Export per write.csv2() das Argument dec='.' setzen, also write.csv2(..., dec='.')
Siehe den Hilfetext der Funktion

Code: Alles auswählen

?write.table

Re: Matrixmultiplikation

Verfasst: So Okt 09, 2016 1:43 pm
von tr206
Das habe ich schon probiert aber es geht leider nicht.

Code: Alles auswählen

write.csv2(PC1,file ="D:\\PCACanada.csv",dec=".")
Warning message:
In write.csv2(PC1, file = "D:\\PCACanada.csv", dec = ".") :
  attempt to set 'dec' ignored
Mit WriteXLS krieg ich das auch nicht hin:

Code: Alles auswählen

WriteXLS(PC1,ExcelFileName ="PCACanada.xls")
Error in WriteXLS(PC1, ExcelFileName = "PCACanada.xls") : 
  'x' must be the name of a data frame, the name of a list of data frames, a data frame object, a list object of data frames.
Write.table() funktioniert noch weniger. Mit write.csv() bin ich bis auf die Darstellung der Werte zufrieden, da dies relativ nahe dem ist was ich will.

Re: Matrixmultiplikation

Verfasst: So Okt 09, 2016 2:15 pm
von jogo
Eine andere Variante ist, die Datei nicht mit der Endung *.csv zu versehen, sondern mit *.txt

Code: Alles auswählen

write.csv2(PC1,file ="D:\\PCACanada.txt")
Beim Import in Excel kann man dann alles Mögliche an Optionen einstellen.

Re: Matrixmultiplikation

Verfasst: So Okt 09, 2016 2:21 pm
von student
Hallo tr206,

also, Deine Datei sieht so aus:
"";"PC1";"PC2";"PC3";"PC4";"PC5"
"1";-3,17795849936673;-2,87531358655512;-2,50442180685335;3,68211984262637;-2,34892049862692
"2";-3,44984714202019;-2,87143859947737;-2,54006724080431;3,76264622616785;-2,15594810554274
"3";-3,52762756313604;-2,81163250548469;-2,62351295939327;3,73962303154399;-2,08456818211715
"4";-3,50100548788881;-2,73112691715543;-2,6
Sieht doch gut aus!? Das Dezimaltrennzeichen ist ein Komma und lässt sich prima in Excel als csv-Datei einlesen (siehe Bild):
Excel-Datei.jpg