Mam następujący prosty zestaw danych z dwiema zmiennymi ciągłymi; to znaczy:
d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273
Muszę zmienić dane tak, aby korelacja między zmiennymi wynosiła ~ 0,6. Muszę utrzymać średnie i inne statystyki opisowe (sd, min, max itp.) Obu zmiennych na stałym poziomie.
Wiem, że możliwe jest dokonanie prawie dowolnej korelacji z podanymi danymi, tj .:
d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585
Jeśli spróbuję użyć sample
funkcji do tego zadania:
cor.results = c()
for(i in 1:1000){
set.seed(i)
d3 = with(d,data.frame(x=sample(x),y=sample(y)))
cor.results = c(cor.results,cor(d3$x,d3$y))
}
Dostaję dość szeroki zakres korelacji:
> summary(cor.results)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.281600 -0.038330 -0.002498 -0.001506 0.034380 0.288800
ale ten zakres zależy od liczby wierszy w ramce danych i maleje wraz ze wzrostem wielkości.
> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results = c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-0.1030000 -0.0231300 -0.0005248 -0.0005547 0.0207000 0.1095000
Moje pytanie brzmi:
Jak zmienić porządek takiego zestawu danych, aby uzyskać korelację (tj. 0,7)? (Dobrze będzie również, jeśli metoda usunie zależność od rozmiaru zestawu danych)
źródło
Aby wygenerować dwa jednolite rozkłady z określoną korelacją, zadziała algorytm Ruscio i Kaczetow (2008). Zapewniają one kod R . Następnie można przekształcić za pomocą prostej funkcji liniowej, aby uzyskać docelową wartość minimalną, maksymalną, średnią i SD.
Algorytm Ruscio i Kaczetowa
Podsumuję przypadek dwuwariantowy, ale może on również działać z problemami wielowymiarowymi. Nieskorelowane i są generowane z dowolnym kształtem (np. Jednolitym). Następnie i są generowane jako dwuwymiarowe normalne z korelacją pośrednią. i są zastępowane przez i w sposób zachowujący rangę. Dostosuj korelację pośrednią, aby była wyższa lub niższa w zależności od tego, czy r ( ) jest za niskie, czy za wysokie. i są generowane jako dwuwymiarowe normalne z nową korelacją pośrednią. Powtarzać.Xo Yo X1 Y1 X1 Y1 X0 Y0 X1,Y1 X2 Y2
Zauważ, że jest to bardzo podobne do rozwiązania @ Svena Hohensteina, z tą różnicą, że jest iteracyjne, więc korelacja pośrednia będzie się zbliżać do korelacji docelowej, dopóki nie będzie nie do odróżnienia. Zauważ też, że ten algorytm może być użyty do wygenerowania dużej populacji (np. N = 1 milion), z której można pobrać mniejsze próbki - jest to przydatne, jeśli potrzebujesz błędu próbkowania.
Dla pokrewnego postu: Korelacje i rozkłady niestandardowe
Zachowanie statystyki opisowej
Nie ma gwarancji, że algorytm wygeneruje dokładnie takie same opisy. Ponieważ jednak średnia rozkładu równomiernego i SD są określone przez jego min i maks, możesz po prostu dostosować min i maks, aby wszystko naprawić.
Niech i będą twoimi zmiennymi wygenerowanymi z ostatniej iteracji algorytmu Ruscio & Kaczetow, i będą twoimi zmiennymi końcowymi, które masz nadzieję (z opisami celów), a i będą twoimi oryginalnymi zmiennymi w zbiorze danych.Xg Yg Xf Yf X Y
ObliczXf=(Xg−min(X))∗(max(X)−min(x))/(max(Xg)−min(Xg))
Zrób to samo dlaYf
Odniesienie:
Ruscio, J., i Kaczetow, W. (2008). Symulowanie wielowymiarowych nienormalnych danych przy użyciu iteracyjnego algorytmu. Multivariate Behavioural Research, 43, 355–381. doi: 10.1080 / 00273170802285693
źródło
Zgaduję, że mówiąc „ponownie próbkuj” masz na myśli „symuluj”, co jest bardziej ogólne. Poniżej znajduje się najbardziej zwięzły sposób, jaki znam do symulacji normalnych danych dwuwymiarowych z określoną korelacją. Zastąp własne pożądane wartości r i n.
źródło