[ mirjanagb @ 17.03.2009. 14:41 ] @
opet ja ... znam da sam dosadna ... ali ... ako neko zna.

evo najbolje da postavim excel file...

primer 2 funkcionise ... isti je rezultat izracunato i pomocu formule i vba koda

ali primer 1 ne.

da li neko mozda zna kako napisati formulu iz vba koda.
[ Jpeca @ 17.03.2009. 19:20 ] @
Iz primera mi nije jasno o čemu se radi.
Definisala si korisniču funkciju K_tau u okviru modula, koja nešto računa na osnovu dva niza podataka. Iskoristila si tu funkciju u tabeli - formule u ćelijama F46 i M46. Koliko ja razumem u F46 poziva se ova funkcija za primer1, a u M46 za primer 2.
E sad, porediš rezultat te funkcije sa formulama u F43 i M43 - ali obe ove formule koriste primer2? Ista formula
Code:
=+K41/H43

pojavljuje se u obe ćelije. Nije mi jasno kako onda možeš porediti? Takođe ova formula rezultat je vrednosti samo jednog niza (iz kolone G), a u funkciji pozivaš dva niza.

Pokušaj da objasniš šta funkcija tačno treba da radi ako ti treba pomoć oko koda.

[Ovu poruku je menjao Jpeca dana 17.03.2009. u 21:17 GMT+1]
[ mirjanagb @ 18.03.2009. 09:56 ] @
da ista formula i na kraju se dobije isti rezultat.
i sad mi nije jasno kako na jednostavnim primerima formula funkcionise, a na komplikovanijim ne.

pa pretpostavljam da u makrou, se mnozi prva i druga kolona, a prvo se oduzimaju brojevi x2-x1, x3-x2 (ili gresim)
(dakle prve kolone i druge kolone)

ja sam to napisala formulom:
=if(L5>L4;L4-L5;0) =if(M5>M4;M4-M5;0)

za prvu i drugu kolonu i onda ih pomnozila.



Code:

Function K_tau(ByVal X1 As Range, ByVal X2 As Range) As Double
Dim i As Long, j As Long, s As Long, n As Long
n = X1.Rows.Count
For i = 1 To n
For j = i To n
If j > i Then
s = s + Sgn((X1.Cells(i, 1) - X1.Cells(j, 1)) * (X2.Cells(i, 1) - X2.Cells(j, 1)))
End If
Next
Next
K_tau = (Application.WorksheetFunction.Combin(n, 2) ^ -1) * s
End Function


ovo n mi je jasno

j mora biti vece od i da bi pokrenulo funkciju s

nije mi jasno sta je ovo s "s" = "s" + Sgn(....

i sta znaci Combin(n, 2)^-1*s

jel to znaci n*2 pa na -1 ili ?


evo sad sam pokusala samo na primeru 2.

pomocu formule (iz knjige), pomocu makroa i pokusaj da makro ja sama uradim. kao sto pise u njemu.

[ Jpeca @ 18.03.2009. 10:35 ] @
s je medjurezultat koji se formira za izračunavanje vrednosti funkcije - o čemu se tačno radi ne znam, ali obrati pažnju da zbog sgn u svakoj iteraciji menja za -1,0 ili 1!
Izraz
Code:
Application.WorksheetFunction.Combin(n, 2) ^ -1

je recipročna vrednost broja kombinacija drugog reda od n elemenata. Tj. (n-k)!k!/n! = 2/(n*(n-1))
Deo koda
Code:
 
For j = i To n
If j > i Then 
...
End If
Next

meni nije jasan jer je zbog uslova u For petlji j uvek veće od i osim u prvoj iteraciji, pa mi se čini da je IF nepotrebno
Code:
 
For j = i+1 To n
...
Next


[ mirjanagb @ 18.03.2009. 10:53 ] @
prvo izvinjavam se zbog nejasno napisanog prvog posta ... inace se i poslednjih dana osecam tako nejasno ...


kendal tau, to je ustvari rangiranje, pa npr:


x y Nc Nd

1 2 3 1
2 1 3 0
3 4 1 1
4 5 0 1
5 3 0 0

Nc su brojevi koji su veci od prethodnog broja (kad gledam kolonu y, ispod 2 su 3 broja veca od 2; ispod 1 su 3 brojeva veca)

nd su brojevi manji od prethodnog broja (opet kolona y, ispod 2 je jedan broj manji, ...)

suma nc = 7
suma nd = 3

7-3=4

dalje po formuli imamo 5 brojeva pa bi bilo: 5*(5-1)/2= 10

znaci da je tau= 4/10 = 0,4

isti ova jrezultat dobijem i sa makroom =k_tau((a1:a5);(b1:b5))= 0.4

ali to je jednostavan primer kad je prva kolona od 1 - 5.



[Ovu poruku je menjao mirjanagb dana 18.03.2009. u 13:01 GMT+1]
[ Jpeca @ 18.03.2009. 12:49 ] @
Na osnovu onoga što sam našao na wikipedi http://en.wikipedia.org/wiki/Kendall_tau_distance
kod za funkciju mogao bi da bude sledeći:
Code:

Function K_tau(ByVal X1 As Range, ByVal X2 As Range) As Double
' Obracun Kendall Tau distance - mere korelacije
' izmedju dva niz podataka X1 i X2
'
Dim i As Long, j As Long, s As Long, n As Long
n = X1.Rows.Count
For i = 1 To n
  For j = i + 1 To n
   If Sgn(X1.Cells(i, 1) - X1.Cells(j, 1)) <> Sgn(X2.Cells(i, 1) - X2.Cells(j, 1)) Then
      s = s + 1             ' Razlicit redosled elemenat i i j u dva niza
   End If
  Next
Next
K_tau = 2 * s / (n * (n - 1))
End Function

Što se tiče tvoje računice za Nc i Nd pomoću formula u tabeli nisam siguran da to može tako.
U wikipedi Nc i Nd su drugačije definisane. Upoređuju se odgovarajući elementi iz oba niza dok ti u formulama radiš samo sa jednim nizom
(kolona G u primeru 1).
[ mirjanagb @ 18.03.2009. 15:10 ] @
http://en.wikipedia.org/wiki/Kendall%27s_tau


da ispadne tacan rezultat, i kad ja uradim peske i preko tvog makroa.

ali ovo je samo u slucaju kad je <

a meni treba i kad je >, dakle korelacija veceg i manjeg.

na ovoj adresi je formula (ta i sa Nc i Nd)

na ovaj tvoj makro, moze li se dodati, dakle i kad je > i onda da se oduzmu ta dva broja i onda da se dobije "s"?
[ Jpeca @ 18.03.2009. 20:32 ] @
Preradio sam funkciju tako da računa Nc i Nd prema definicije Nc i Nd koju sam našao na wikipedi.
Code:

Function K_tau(ByVal X1 As Range, ByVal X2 As Range) As Double
' Obracun Kendall Tau - Kendall's rank correlation
' izmedju dva niz podataka X1 i X2
'
Dim i As Long, j As Long, n As Long
Dim Nc As Long, Nd As Long
n = X1.Rows.Count
For i = 1 To n
  For j = i + 1 To n
   If Sgn(X1.Cells(i, 1) - X1.Cells(j, 1)) = Sgn(X2.Cells(i, 1) - X2.Cells(j, 1)) Then
      Nc = Nc + 1  ' saglasni par
   Else
      Nd = Nd + 1  ' nesaglasni par
   End If
  Next
Next
K_tau = 2 * (Nc - Nd) / (n * (n - 1))
End Function


Uporedio sam rezultate sa nekim primerima na mreži (npr. http://www.statsdirect.com/help/nonparametric_methods/kend.htm) i pokazalo se slaganje. Bilo bi puno lakše da si na početku jasno opisala način dolaženja do potrebnog rezultata na nekom primeru.






[ mirjanagb @ 19.03.2009. 09:16 ] @
znam, zato se izvinjavam jos jednom ....

e to je ono sto trazim ... dosta je lakse za razumeti, a potom objasniti ...

hvala puno na ulozenom trudu !!!!
!!!