Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
816to820
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
816to820
816to820
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Matrix automatisch mit Korrelation füllen

Matrix automatisch mit Korrelation füllen
05.11.2006 13:25:37
Thomas
Hallo Excelfreunde,
Die Zahlen unten zeigen die Spalten A:und B:. Ich möchte gerne, dass in der Spalte C: automatisch die Korrelationswerte(korrel-fkt)eingefügt werden, da die Spaltenlänge von A:(B: wird aus A: berechnet) sehr stark variiert.
Beim Bsp. heisst das,
in c(30)=korrel(A30:A31,B30:B31)
C(29)=korrel(A29:A31,B29:B31)
C(28)=korrel(A28:A31,B28:B31)
C(27)=korrel(A27:A31,B27:B31) usw.
bis man bei c(16) angekommen ist, also in der B-Spalte danach eine Leerzeile auftritt.
C(31) geht nicht, da die letzten werte von A: und B: gleich sind (Kann auch bei anderen Paarungen noch passieren(Standartabweichung = 0))
Kann mir jemand bei dem Makro/VBA helfen? Danke für die Mühe .
Thomas
1----67.35
2----68.00
3----66.25
4----65.05
5----65.55
6----65.70
7----66.00
8----66.50
9----67.05
10--67.30
11--66.55
12-- 66.50
13-- 67.55
14-- 67.15
15-- 66.10
16-- 67.25-- 66.89354839
17-- 67.45-- 66.83965517
18-- 66.35-- 66.92777778
19-- 68.50-- 67.032
20-- 68.20-- 67.1
21-- 68.15-- 67.09285714
22-- 67.50-- 67.15263158
23-- 67.05-- 67.19117647
24-- 67.20-- 67.19
25-- 66.90-- 67.23461538
26-- 66.80-- 67.03181818
27-- 67.00-- 66.85555556
28-- 66.80-- 66.77857143
29-- 66.60-- 66.75
30-- 66.15-- 66.65
31-- 67.20-- 67.2

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Matrix automatisch mit Korrelation füllen
05.11.2006 15:14:22
ingUR
Hallo, Thomas,
was immer Du mit Deiner Untersuchung beabsichtigst, ich hab's nicht verstanden, warum Du dafür eine VBA-Prozedur benötigst.
Natürlich hast Du in Deinem Beispiel in der Spalte C nicht die Ergebnmisse einer Korrelationberechnung angegeben, die ja nur zwischen -1 und +1 schwanken. So bekommst Du also jeweils in der Zeile i immer Nur die Aussage, ob der Folgewert B(i+1) gegenbüber den Referenzwer B(i) gestiegen ist (Ergebnis +1) oder aber gefallen ist (Ergebniswert -1), da Du ja den Zuwachs zwischen den Zelle B(i) und B(i+1) mit dem zwischen den Zellen A(i) und A(i+1) vegleichst.
mit den Grenzen, die Du für Deine Untesuchung vorgibst, könnte folgende IF-Klammerung die Zellen der Spalte C füllen:

=WENN(ODER(A18<16;ISTZAHL(B19)=FALSCH);"";KORREL(A2:A3;B2:B3))
Wenn Dir also die mit einer Bedingung arbeitenden Zellenformel nicht nutzt, dann kannst Du folgendses Makro einsetzen, wenn für alle Werte der der Spalte B ab der Zelle B16 die Vorzeichen der Veränderung errechnet werden sollen und in der Spalte C ausgegeben werden sollen:
Sub DirectionAll()
Dim rngData As Range
Range("C2:C" & ActiveSheet.Rows.Count).ClearContents
For Each rngData In Range("B16:B" & Cells(ActiveSheet.Rows.Count, "B").End(xlUp).Row - 1)
rngData.Offset(0, 1) = Sgn(rngData.Offset(1, 0) - rngData)
Next
End Sub
Möchstest Du hingengen mit Eingabe einer neuen Zahl in der Spalte B die berechnung für das Datenpaar erhalten, Di also z.B. Zelle B18 füllst und die Prozedur dann in C17 den Vorzeichenwert der Veränderung zwichen Zelle B17 und B18 schreibt, dann ist eine Makro für die Tabelle zu schreiben, dass zwar keine Schleife benötigt, jedoch andere Zusatzabfragen zur Untersuchung, ob eine eintrag in der Spalte B erfolgte und ob die Vorhergehende Zelle nach der Zeile 15 sich befindet und mit einem Wert gefüllt ist. diese Zusazarbeit habe ich mir gespart, zumal Du durchaus, bei überschaubaren Datenmengen, die "Geasamtbereichnung durchführen kanst, sobald eine Zelle der Spalte B verlassen wird.
Gruß,
Uwe
Anzeige
AW: Matrix automatisch mit Korrelation füllen
05.11.2006 17:34:47
Thomas
Hallo Uwe und danke,
aber ich habe anbei die Korrelwerte von C(30)=1 bis c(27)=0.85450848 für das Beispiel mit der Zellenformel Korrel berechnet und weiss deshalb nicht genau was du meinst.
Da ,wie gesagt, die A:-Spalte in der Grösse sehr variiert(kann durchaus fünfstellig werden),wäre ein makro besser, sagt mir mein Laienverstand.
MfG Thomas
0.85450848
0.902689878
0.963823456
1
AW: Matrix automatisch mit Korrelation füllen
05.11.2006 19:59:31
Erich
Hallo Thomas und Uwe,
zunächst eine klärende Info:
In Spalte B stehen spezielle Mittelwerte von Bereichen aus A:
B31 = Mittelwert(A31:A31)
B30 = Mittelwert(A29:A31)
B29 = Mittelwert(A27:A31)
...
B16 = Mittelwert(A1:A31) (wenn Anzahl ungerade wie 31)
B16 = Mittelwert(A2:A30) (wenn Anzahl ungerade wie 30)
Das war Thema in https://www.herber.de/forum/archiv/816to820/t816419.htm
Dort gibts auch ein Makro, das die Mittelwerte rechnet.
Die Korrelationen lassen sich zunächst einmal mit Formeln berechnen:
 ABC
167,35  
268,00  
366,25  
465,05  
565,55  
665,70  
766,00  
866,50  
967,05  
1067,30  
1166,55  
1266,50  
1367,55  
1467,15  
1566,10  
1667,2566,89354840,46573128
1767,4566,83965520,47413342
1866,3566,92777780,51683882
1968,5067,03200000,50817076
2068,2067,10000000,59422388
2168,1567,09285710,63477471
2267,5067,15263160,78376799
2367,0567,12941180,79852730
2467,2067,19000000,78706526
2566,9067,23461540,74309806
2666,8067,03181820,81294598
2767,0066,85555560,85450848
2866,8066,77857140,90268988
2966,6066,75000000,96382346
3066,1566,65000001,00000000
3167,2067,2000000 
32   

Formeln der Tabelle
ZelleFormel
B1=WENN((ZEILE()<=ANZAHL($A:$A)/2)+(ZEILE()>ANZAHL($A:$A))>0;""; MITTELWERT(BEREICH.VERSCHIEBEN($A$1;2*(ZEILE()-ANZAHL($A:$A)/2)-1;;2*(ANZAHL($A:$A)-ZEILE())+1)))
C1=WENN((B1="")+(B2="");"";KORREL( INDIREKT("A"&SUMME(ZEILE())&":A"&ANZAHL(A:A)); INDIREKT("B"&SUMME(ZEILE())&":B"&ANZAHL(A:A))))
B15=WENN((ZEILE()<=ANZAHL($A:$A)/2)+(ZEILE()>ANZAHL($A:$A))>0;""; MITTELWERT(BEREICH.VERSCHIEBEN($A$1;2*(ZEILE()-ANZAHL($A:$A)/2)-1;;2*(ANZAHL($A:$A)-ZEILE())+1)))
C15=WENN((B15="")+(B16="");"";KORREL( INDIREKT("A"&SUMME(ZEILE())&":A"&ANZAHL(A:A)); INDIREKT("B"&SUMME(ZEILE())&":B"&ANZAHL(A:A))))
B16=WENN((ZEILE()<=ANZAHL($A:$A)/2)+(ZEILE()>ANZAHL($A:$A))>0;""; MITTELWERT(BEREICH.VERSCHIEBEN($A$1;2*(ZEILE()-ANZAHL($A:$A)/2)-1;;2*(ANZAHL($A:$A)-ZEILE())+1)))
C16=WENN((B16="")+(B17="");"";KORREL( INDIREKT("A"&SUMME(ZEILE())&":A"&ANZAHL(A:A)); INDIREKT("B"&SUMME(ZEILE())&":B"&ANZAHL(A:A))))

Wenn wegen der Datenmenge die Spalte C per VBA mit Werten gefüllt werden soll, ginge das vermutlich via Evaluate.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Matrix automatisch mit Korrelation füllen
06.11.2006 16:08:51
Thomas
Hallo Erich,
ich danke dir für den zellcode,muss ich mir mal in Ruhe genauer anschauen.
Per VBA habe ich mir schon gedacht ,dass dies nicht einfach werden wird.
In deinem Beitrag "(wenn Anzahl gerade wie 30) sollte da stehen" steht gar nichts,war das ein Versehen? Lass es mich wissen, wenn es relevant ist.
Danke nochmals Thomas
AW: Matrix automatisch mit Korrelation füllen
07.11.2006 17:35:07
ingUR
Hallo, Thomas,
ob Deine Datenanzahl der Spalte A gerade oder ungerade ist, wird durch Deine Aufgabenstellung von Bedeutung. Hast Du 5 Werte, so kanst Du vbis zum 3, vom Ende her gesehen, den Mittelwert berechnen, nämlich mit
x(1)+x(2) + x(3) + x(4)+x(5)
Die Symmetrie in der Summation ist gewart, entfält abe, wenn Du sechs werte hast:
x(1)+x(2) + x(3) + x(4) + x(5) + x(6)
Hier wäre alo nur bis zum Wert x(4) vom Ende her die Summation möglich, um die Symmetrie der Summengliederanzahl zu erhalten
x(2) + x(3) + x(4) + x(5)+x(6)
Wenn also die Symmertie wichtig ist, dann ist die IF-Abfrage im Makro zu verändern:
If r = maxR / 2 Then Exit For Else r0 = 2 * r - maxR
Gruß,
Uwe
den und Korrellation es wird
Anzeige
AW: Frage noch offen !Code-script für Korrelation!
07.11.2006 17:19:42
ingUR
Hallo, Thomas,
die Statistikfunktionen sind auch über die EXCEL-Formeln in VBA verfügabar, wie Erich bereits mit seinem Hinweis auf die VBA-Funktion Evaluate beschrieben hat.
Hier also die Umsetzung als Standard-Modul-Prozedur, die Du über die Tastenkombination [Alt][F8] aufrufen kannst:
Option Explicit
Sub Spezial_MW_KORR()
Dim maxR As Long, r As Long, r0 As Long
Columns(2).Clear
Columns(3).Clear
maxR = Cells(Rows.Count, 1).End(xlUp).Row
For r = maxR To maxR / 2 Step -1
If r = maxR / 2 Then r0 = 1 Else r0 = 2 * r - maxR
'        Range("A" & r0 & ":A" & maxR).Select  'kann "entkommentiert werden, sodass der Bereich markiert wird
Cells(r, 2) = Evaluate("Average(" & Range("A" & r0 & ":A" & maxR).Address & ")")
'Cells(r, 2) = MW
If r < maxR Then
Cells(r, 3) = Evaluate("Correl(" & Range("A" & r0 & ":A" & maxR).Address & "," & _
Range("B" & r0 & ":B" & maxR).Address & ")")
End If
Next r
End Sub
Beim Umsetzen viel Erfolg!
Uwe
P.S.
Über die Formeln für die Korrelation findest Du auch in der EXCEL-Hilfe.
KORRELATION K(X;Y) = (1/n) * SUM( (x(i)-xm)*(y(i)*ym) ) für i=1 ...n
Anzeige
AW: Frage noch offen !Code-script für Korrelation
07.11.2006 21:09:21
Erich
Hallo Thomas und Uwe,
Uwes Code trifft ja wohl den Nagel auf den Kopf!
Eine Verkürzung und eine kleine Korrektur möchte ich noch vorschlagen:
Die Verkürzung: "A1" statt Range("A1").Address
Die Korrektur: r statt r0 in der Correl-Formel
Sub Spezial_MW_KORR2()
Dim maxR As Long, r As Long, r0 As Long
Columns("B:H").ClearContents
maxR = Cells(Rows.Count, 1).End(xlUp).Row
For r = maxR To maxR / 2 Step -1
If r = maxR / 2 Then r0 = 1 Else r0 = 2 * r - maxR
Cells(r, 2) = Evaluate("Average(A" & r0 & ":A" & maxR & ")")
If r < maxR Then Cells(r, 3) = Evaluate("Correl(A" & r & ":A" & maxR & "," _
& "B" & r & ":B" & maxR & ")")
' ab hier nur zum Schauen und Testen
Cells(r, 5).Formula = "=Average(A" & r0 & ":A" & maxR & ")"
If r < maxR Then Cells(r, 6).Formula = "=Correl(A" & r & ":A" & maxR & "," _
& "B" & r & ":B" & maxR & ")"
If r < maxR Then Cells(r, 8).Formula = "=Correl(A" & r0 & ":A" & maxR & "," _
& "B" & r0 & ":B" & maxR & ")"
Next r
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Frage noch offen !Code-script für Korrelation
07.11.2006 22:37:34
ingUR
Hallo, Erich,
Dank für Deine Hilfestellung und Vereinfachungsvorschläge.
Ohne jedoch jetzt Deinen modifizierten Code in einer EXCEL-Mappe auspropiert zu haben, leuchtet mir die vermeintlich notwendige Korrektur r statt r0 nicht wirklich ein.
Die Schleife läuft mit seinem Schleifenzähler rückwärts (Step -1). Dabei wird mit r die Zeile benannt, für die im aktuellen Schleifendurchlauf die Werte zu sind; r stellt somit die "Symmetrieachse" der hierfür zu erfassenden Werte dar.
Nach der Zeile r folgen noch genau maxR-r Werte, und genauso viel sollen oberhalb der Zeile r zur Mittelwert- und Korrelationberechnung berücksichtigt werden, so dass mit r0 die Startzeile vor der "Zentrumszeile" r bezeichnet wird.
Der Bereich besteht somit aus den (r-r0)-Elementen vor der Zeile r und den (maxR-r)-Elementen nach der Zeile r und natürlich dem Element der Zeile r selbst. Warum also die Änderung, wenn der Bereich nach Aufgabenstelleung zeilenmäßig von r0 bis maxR zu reichen hat?
Gruß,
Uwe
Anzeige
AW: Frage noch offen !Code-script für Korrelation
08.11.2006 00:05:10
Erich
Hallo Uwe,
schau dir mal die Mappe an:
https://www.herber.de/bbs/user/37954.xls
An den Spalten C und F zeigt sich, dass die Ergebnisse bei "r0" mit den Ergebnissen bei "r" übereinstimmen.
Das liegt aber nur daran, dass zum Auswertungszeitpunkt in einem Teil der mit "r" ausgewerteten Zeilen (noch!) keine Werte stehen.
In Spalte H stehen die Formeln (mit r0), die du mit Evaluate hast auswerten lassen.
Ich halte es für sinnvoller, in Zeile 15
"KORREL(A15:A30;B15:B30)" auswerten zu lassen als
"KORREL( A1:A30; B1:B30)", denn B1:B14 ist leer.
Die Formeln mit "r" in Spalte G liefern (sowohl zum Evaluate-Zeitpunkt als auch nach Makroende) die richtigen Werte, wie auch Spalte C.
Das, was du zur Symmetrieachse schreibst, leuchtet mir bezüglich der Mittelwerte ein.
Die Korrelationen haben IMHO wenig damit zu tun.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Danke, Eriche, für Deine Arbeit, ...
09.11.2006 08:09:16
ingUR
... so dass auch ich jetzt erkenne, warum natürlich Deine Bereichsangabe für die Korrelation der korrekte Ansatz ist, so wie er auch in der Ausgangsfrage von Thomas formuliert wurde.
Hruß,
Uwe
Ihr Beide seid Super !Dank an Uwe und Erich
08.11.2006 13:32:27
Thomas
Hallo ihr beiden,
Ich bin euch sehr dankbar für den Code und die Info`s zu VBA.Tolle Arbeit!!
Gruss Thomas
AW: Matrix automatisch mit Korrelation füllen
07.11.2006 16:52:59
ingUR
Danke für den Hinweis, Erich,
denn den Beitragsfaden zur Frage der Mittelwertbildung habe ich nicht gekannt, so dass ich auf die Ordnungszahlen bereits als Tabellenwerte interpretierte.
Gruß,
Uwe
(wenn Anzahl gerade wie 30) sollte da stehen
05.11.2006 20:01:26
Erich
AW: (wenn Anzahl gerade wie 30) sollte da stehen
07.11.2006 11:38:06
Thomas
Habe vorhin wohl den Haken bei Frage offen vergessen.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige