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