Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych

Witam czy ktos moze mi pomoc napisac funkcje ktora bedzie liczyla nastepujace:

Mam nastepujacy zbior danych:
names(ds):
"Patient" "GroupN" "pS1" "pS2" "pS3" "pS4" "pS5" "pS6" "pS7" "pS8" "pCO2"

dla tego zbioru robie analize i zapisuje wynik w pdf bo w resultacie otrzymuje rozne ploty.
w moim przypadku jest to analiza PCA i wynik z pierwszych trzech (principal components) plotuje do pdf:
pdf(file='results/analysis/all_variable.pdf')

To dziala bez problemowo, ale chodzi o to zeby zrobic funkcje ktora za kazda iteracja liczy dla roznej ilosci zmiennych:
zmienne "Patient", "GroupN", "pCO2" beda zawsze w zbiorze danym, chodzi o to zeby za kazda iteracja dodac do tych zmienych po kolei najpierw pS1 i zapisac wynik w pdf o nazwie pS1
potem w drugiej iteracji zamiast pS1 dodac pS2 i zapisac wynik w pS2 i tak az do konca
wiec dla pierwszej iteracji zbior daych bedzie wygladal:
"Patient" "GroupN" "pS1"
wiec dla pierwszej iteracji zbior daych bedzie wygladal:
"Patient" "GroupN" "pS2"
wiec dla pierwszej iteracji zbior daych bedzie wygladal:
"Patient" "GroupN" "pS3"
....itd

mam nadzieje ze ktos bedzie mi w stanie pomoc, z gory dziekuje
Maciej B.

Maciej B. Doktorant

Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych

Chcesz łączyć te zbiory poleceniem merge?

Jeżeli nie to wystarczy, że będziesz robiła tak:
zbior_danych - twój zbiór


nkol<-ncol(zbior_danych) # liczba zmiennych
stale_zmienne<-c(1,2,nkol) # numery kolumn, które są stałe


zbior_danych[,c(stale_zmienne,i)] ##odwołanie do kolumn ze stałymi zmiennymi i zmienną, która będzie "dołączana"
names(zbior_danych)[i] ## nazwa zmiennej, która będzie dopisywania do nazwy pliku

Kod do wykresów.

for (i=3 to (nkol-1){
pdf(paste("wykres_dla",names(zbior_danych)[i],'.pdf')
print(plot(zbior_danych[,c(stale_zmienne)]+zbior_danych[,i]))
dev.off()
}



Jednak musisz określić, które zmienne mają być rysowane i odpowiednio zmienić.

Edit: wprowadziłem małą poprawkę bo myślałem o czym innym jak to robiłem :D

Edit2: Dobrą praktyką było by przygotowanie przykładowego zbioru.Maciej B. edytował(a) ten post dnia 04.02.13 o godzinie 18:40

Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych

Może coś takiego?

 > dane <- data.frame(Patient=c(1), GroupN=c(2), pCO2=c(3), pS1=c(10), pS2=c(20), pS3=c(30))
> dane
Patient GroupN pCO2 pS1 pS2 pS3
1 1 2 3 10 20 30

> zmienne <- names(dane)[grep("pS[0-9]", names(dane))]

> zmienne
[1] "pS1" "pS2" "pS3"

> for(i in zmienne) { #tutaj robisz to, co potrzeba
+ print(dane[1, "Patient"] + dane[1, "GroupN"] + dane[1, "pCO2"] + dane[1, i])
+ }
[1] 16
[1] 26
[1] 36


Jak widać, pętla przeiterowała po zmiennych i wykonała dla każdej obliczenia.
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych

Dzieki wielkie Maciej i Adrian za zainteresowanie sie tematem i rozwiazania.
Adrian nie moglam zastosowac tego co piszesz bo u mnie zmienna GroupN jest class factor
Levels: c-p-s lis
i otrzymuje error " not meaningful for factors". Prosze spojrz na ponizsze rozwiazanie moze da sie cos przerobic albo dalej da sie zrobic z ponizszym.
Sprobowalam zastosowanic to co pisze Maciej i to wydaje sie ze dziala.
Podam konkretnie moj przyklad zeby bylo wiadmo co wlasciwie ta funkcja ma robic. length(vardf$Patient) jest 23
Patient moze byc w Groupie c-p-s lub lis (9 pacjentow jest w obu, jak ponizej widac np patient 10 a 4 pacjentow jest tylko w lis)

Oto 4 pierwsze wiersze z mojego datasetu, ktory u mnie nazywa sie vardf,

head(vardf):
Patient GroupN pS1 pS2 pS3 pS4 pS5 pS6 pS7 pS8 pCO2
10 c-p-s 1274.0 1365.5 950.5 1111.0 1279.5 353.0 138.0 1147.0 61.5
10 lis 623.5 879.5 633.0 676.5 637.0 130.0 14.5 595.5 38.5
11 c-p-s 856.0 624.5 430.5 473.0 796.5 212.0 42.5 812.5 59.0
11 lis 236.0 466.0 321.0 367.0 351.0 81.0 5.0 332.0 40.0


nkol<-ncol(vardf)
stale_zmienne<-c(1,2,nkol)


for (i in 3:(nkol-1)){
K1 = vardf[,c(stale_zmienne,i)]$GroupN == "c-p-s" #dla rozroznienia grup
K3 = vardf[,c(stale_zmienne,i)]$GroupN == "lis"

pdf(paste("plot_for",names(vardf)[i],'.pdf'))

#analiza PCA
pca_p = prcomp((vardf[,c(stale_zmienne,i)])[,-c(1,2)],scale.=T)

#wyciagniecie 1go i 2giego komponentu, w tym przypadku sa tylko dwa
p12<-pca_p$x[,c(1,2)]

plot(p12, pch=16, col="white")
points(p12[K1,],pch=15,col="green")
points(p12[K3,],pch=19,col="red")
abline(h = 0, v = 0, lty=2)
legend("bottomright", legend = c("c-p-s","lis"), col = c("green","red"), pch = c(15,19), cex = 1.2)
title("1st and 2nd PC")

dev.off()
}


Bede wdzieczna jak bedziecie mogli mi dalej pomoc, dalej moj problem jest baardzo skomplikowany.
Teraz chodzi o to by funkcja, liczyla dokladnie to samo co powyzej tylko ze teraz zamiast dodania jednej zmiennej do stalych zmiennych musza byc dodane 2 zmienne.
No wiec kolejne iteracje beda wygladaly tak:
"Patient" "GroupN" "pS1" "pS2"
"Patient" "GroupN" "pS1" "pS3"
...
"Patient" "GroupN" "pS2" "pS3"
"Patient" "GroupN" "pS2" "pS4"
itd...
w kolejnych iteracjach musi byc kombinacja dwoch zmiennych, oczywiscie kazdy z kazdym, z tym ze kolejnosc nie ma znaczenia czyli "pS1" "pS2" i "pS2" "pS1" to to samo.

Nie wiem czy jest mozliwe zrobienie czegos takiego:
zeby w nastepnym kroku zamiast 2 zmiennych dodac 3 zmienne (wszystkie mozliwe kombinacje), oczywiscie w wyniku ma za kazdym razem dawac pdf z plotem (jak w pierwszym przypadku). Moga tez te ploty byc w jednym pdf aby tylko gdzies kolo plotu musi wypisywac dla jakich zmiennych on jest.

Potem nastepny krok to zamiast dodawania 3 zmiennych ma byc dodawane 4 (wszystkie mozliwe kombinacje, oczywiscie kolejnosc nie ma znaczenia) i dalej analogicznie jak powyzej opisane.

Nastepnie w kolejnym kroku zamiast dodania 4 zmiennych, dodac 5 (wszystkie mozliwe kombinacje i kolejnosc nie ma znaczenia) i dalej analogicznie.

W kolejnym kroku zamiast dodania 5 zmiennych, dodac 6 (wszystkie mozliwe kombinacje i kolejnosc bez znaczenia) i dalej analogicznie.

I w ostatnim kroku zamiast 6 zmiennych dodac 7 zmiennych. Tu nastepujace kombinacje sa mozliwe:
1) pS1 pS2 pS3 pS4 pS5 pS6 pS7 (bez pS8)
2) pS1 pS2 pS3 pS4 pS5 pS6 pS8 (bez pS7)
3) pS1 pS2 pS3 pS4 pS5 pS7 pS8 (bez pS6)
4) pS1 pS2 pS3 pS4 pS6 pS7 pS8 (bez pS5)
5) pS1 pS2 pS3 pS5 pS6 pS7 pS8 (bez pS4)
6) pS1 pS2 pS4 pS5 pS6 pS7 pS8 (bez pS3)
7) pS1 pS3 pS4 pS5 pS6 pS7 pS8 (bez pS3)
8) pS2 pS3 pS4 pS5 pS6 pS7 pS8 (bez pS2)

Zdaje sobie sprawe ze moj problem jest baaardzo trudny do rozwiazania i nie wiem czy ktos bedzie umial to zrobic. Moze choc dla dwoch zmiennych ktos bedzie umial zrobic. Moze tez byc ze to beda osobne funkcje dla 2 zmiennych, potem inna funkcja dla 3 zmiennych, potem inna dla 4 zmiennych itd.
Ilosc funkcji nie ma znaczenia aby tylko liczylo tak jak w pierwszym przypadku dla 1 zmiennej.
Z gory wielkie dzieki.Kama Jansen edytował(a) ten post dnia 05.02.13 o godzinie 10:41
Maciej B.

Maciej B. Doktorant

Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych

Proszę edytuj wpis i zapisz go używając code i /code zapisane w nawiasach kwadratowych. Masz na goldenline, zaraz pod oknem wpisu: "Jak dodać linki, zdjęcia itp.".Maciej B. edytował(a) ten post dnia 05.02.13 o godzinie 06:41
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Jak napisac funkcje dla zmieniajacej sie ilosci zmiennych

Witam znow, przerobilam kod z poprzedniego postu i teraz mam wszystkie wykresy w jednym pdf:

nkol<-ncol(vardfall)
fix_var<-c(1,2,nkol)

pdf(file='analysis_1.pdf')
par(mfrow=c(2,2));

for (i in 3:(nkol-1)){
K1 = vardfall[,c(fix_var,i)]$GroupN == "c-p-s"
K3 = vardfall[,c(fix_var,i)]$GroupN == "lis"

pca_p = prcomp((vardfall[,c(fix_var,i)])[,-c(1,2)],scale.=T)
p12<-pca_p$x[,c(1,2)]
plot(p12, pch=16, col="white")
points(p12[K1,],pch=15,col="green")
points(p12[K3,],pch=19,col="red")
abline(h = 0, v = 0, lty=2)
title(paste("1st and 2nd PC", names(vardfall)[i]))
}
dev.off()


Zrobilam tez cos podobnego dla dwoch zmiennych (napewno jest lepszy sposob):

pdf(file='analysis_2.pdf')
par(mfrow=c(2,2));

for (i in 3:(nkol-2)){
a=i+1
for (j in a:(nkol-1)){

K1 = vardfall[,c(fix_var,i,j)]$GroupN == "c-p-s"
K3 = vardfall[,c(fix_var,i,j)]$GroupN == "lis"

pca_p = prcomp((vardfall[,c(fix_var,i,j)])[,-c(1,2)],scale.=T)

p12<-pca_p$x[,c(1,2)]

plot(p12, pch=16, col="white")
points(p12[K1,],pch=15,col="green")
points(p12[K3,],pch=19,col="red")
abline(h = 0, v = 0, lty=2)
title(paste("1st and 2nd PC", names(vardfall)[i], names(vardfall)[j]))
}
j=j+1
}
dev.off()


Czy ktos moze mi pomoc zeby zrobic kolejne funkcje dla 3 zmiennych, 4 zmiennych, 5 zmiennych, 6 zmiennych i 7 zmiennych. Dla 8 nie trzeba bo to kompletny zestaw danych i go wczytuje i robie analize dla calosci. Dla 7zmiennych moze by sie dalo ze poprostu w kazdej iteracji 1 zmienna sie odejmuje od calego datasetu, ale nie wiem i tak jak. Bede wdzieczna jak ktos wymysli jak robic te kolejne funkcje

Następna dyskusja:

jak zrobic funkcje dla mode...




Wyślij zaproszenie do