Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

Witam
musze zrobic analize przezycia dla nastepujacego zbioru danych (dataset.csv):
w csv pliku mam w pierwszej kolumnie pacjenci: 1,2,3,4,5,..n, w drugiej kolumnie czas zycia: 1h, 2h, 3h, .. (czas dla kazdego pacjenta jest rozny, jeden pacjent zyje dluzej inny krocej, max 15h), kolejne kolumny to parametry, parametrA, parametrB, parametrC... (kazdy z tych parametrow jest mierzony co godzine, tak jak pokazuje czas zycia), ostatnia kolumna to czas przetrwania (survival time), oczywiscie rozny dla roznych pacjentow (max15.5h)
i teraz musze zrobic cox model zeby wiedziec ktore z parametrow sa najlepszymi predytorami

jaka jest roznica miedzy ponizszymi?:

coxph(Surv(SurvT, status) ~ (parametrA), data = dataset)

cph(Surv(SurvT, status) ~ (parametrA), x=T, y=T, data = dataset)

jak to zrobic zeby jakis model zbudowac, chyba nie recznie wpisywac po kolei parametryA...Z?
to chyba jakos w jednej linijce sie da?cos w tym stylu?

cph(Surv(SurvT, status) ~ (parametrA) + (parametrB) + ...., x=T, y=T, data = dataset)

wiem ze na koncu jak sie juz ma model mozna zrobic fastbw() i otrzyma sie tylko te zmienne ktore musza pozostac w modelu

czy ktos moze mi pomoc w tej kwestii?
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

w csv pliku mam w pierwszej kolumnie pacjenci: 1,2,3,4,5,..n, w drugiej kolumnie czas zycia: 1h, 2h, 3h, .. (czas dla kazdego pacjenta jest rozny, jeden pacjent zyje dluzej inny krocej, max 15h),
...
tak jak pokazuje czas zycia), ostatnia kolumna to czas przetrwania (survival time), oczywiscie rozny dla roznych pacjentow (max15.5h)

Czym się różni czas życia z drugiej kolumny od czasu przetrwania w ostatniej kolumnie?
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

Aha, czas zycia to czas w jakim pacjent zyl i w ktorym dokonywany byl pomiar (co pelna godzine) czyli pierwszy zapis jest 0h (start pomiaru), i kolejne 1h,2h,3h...10h,11h, max h (max jest rozne dla roznych pacjentow); na przyklad gdy max jest 13h a pacjent zyl 13,5h to w kolumnie czas zycia bedzie od 0h do 13h (bo co pelna godzine jest dokonywany pomiar), natomiast w kolumnie czas przezycia bedzie w calej kolumnie dla tego pacjenta wpisane 13,5h
Wojtku jesli nie dokladnie to wyjasnilam prosze o pytania
Z gory dzieki za pomocKama Jansen edytował(a) ten post dnia 14.05.12 o godzinie 23:57
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

Podstawowym problemem z twoimi danymi jest ich układ (wide - zmienne w kolejnych kolumnach), który uniemożliwia przeprowadzenie analizy w taki sposób jaki zamierzasz. Przy takim układzie danych z analizy wypadają wszystkie osoby które mają czas życia poniżej 13 godzin.
Dane należy przetransformować do układu long, tzn. poszczególne okresy obserwacji dla każdego pacjenta muszą być kolejnymi rekordami w zbiorze danych. Dla poszczgólnych okresów obserwacji zmienna przeżycia powinna mieć wartości 0-1, 1-2, 2-3 itd aż do okresu przeżycia gdzie drugi kraniec przedziału to czas przeżycia (oczywiście muszą być dwie zmienne jedna to czas rozpoczęcia obserwacji a druga to czas zakończenia obserwacji). Dodatkowo powinna być utworzona zmienna status (to tylko przykładowa nazwa której najczęściej używam) w której zakodowana jest informacja czy w danym przedziale pacjent zmarł czy przeżył.
W ten sposób powstanie zbiór odpowiedni do analizy. Na podstawie danych w orginalnym formacie można jedynie przeprowadzić analizę przeżycia w zależności od wartości parametu (lub parametrów) mierzonych w chwili 0.
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

dzieki wielkie Wojtek, widze ze jestes poziom advance, ja niestety dopiero beginner; co masz na mysli ze zmienna przezycia powinna miec wartosci 0-1,1-2, u mnie jest poprostu co godzine czas liczony i on jest jednoczesnie czasem kiedy dokonywany jest pomiar, czy mam zrobic dodatkowa kolumne?zmienna status juz mam ale dopisalam do niej same 1 co pacjent zyl przez czaly czas eksperymentu,umarl dopiero na samym koncu.
Poza tym jest taki wymog ze musze moc przewidziec dla czasu dowolnych czasow np. 3h, 6h, 9h.
i do tego trzeba wykorzystac szybkosc rosniecia czy malenia parametru, wiec robie dla kazdego pacjenta lmmodel<-lme(zmienna ~ time) gdzie time to czas w ktorym chce przewidywac, wiec jak np bede chciala przewidywac dla 6h to moj zbior danych bedzie obciety do czasu 6h i dla tego zbioru bedzie lmmodel liczony; z takiego modelu otzymuje coeff 2 czyli beta i to podstawiam do coxph(Surv(czas_przezycia, status) ~ (BetaZmiennaX), data = ds)
i robie jeszcze to, bo gdzies wyczytalam ale nie wiem czym to sie rozni od powyzszego:
cph(Surv(czas_przezycia, status) ~ (BetaZmiennaX), x=T, y=T, data = ds)
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

Ta dyskusja powoli wykracza poza tematykę tego forum więc proponuję przenieść ją do innej grupy bardziej odpowiedniej.
Czas 0-1 to nie do końca precyzyjne określenie, bo dla pacjenta który zmarł w pierwszej godzinie te czasy powinny wynosić 0-czas przeżycia. Zmienna status powinna mieć wartość zero dla osoby która przeżyła i 1 dla tej która zmarła. Analogicznie dane powinny być przygotowane dla kolejnych godzin.
Różnica pomiędzy coxph i cph jest żadna (przynajmniej pod względem modelu jaki dopasowują, bo różnią się nieco pod względem pewnych szczegółów). Pierwsza z funkcji pochodzi z pakietu survival a druga z pakietu Design (oraz nowszego wcielenia pakietu rms).
Funkcja lme i predykcja zmiennej to trochę taki królik z kapelusza, ponieważ wcześniej o tym nie wspominałaś.
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

Chodzi mi o to jak ro zrobic w R wiec dlatego w tej grupie umiescilam ten temat. O tym lm nie wpominalam bo sama nie wiem za bardzo o co chodzi, to wymyslil moj profesor i ma byc teraz tak zrobione zeby uzywac tych coeff2 czyli beta.
czy moge wyslac ci R-kod to zobaczysz czy dobrze i powiesz co dalej?
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

Analiza kodu R na pewno pasuje do tej grupy.
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

Witam i prosze czy ktos moze mi pomoc z R kodem?
Mam taki zestaw danych:
names(ds):
"Patient" "time" "HE" "MAP" "Ammo" "Kreat" "AST" "Bili" "Hb" "group" "survtime"

poniewaz mam missing values robie imputacje:

impute.var <- function(ratid, varname, ds){
ratDF <-subset(ds, Rat==ratid)
varVals <- ratDF[,varname]
varTimes <- ratDF$Tijd
if(sum(is.na(varVals)) > length(varVals)/4) {return(varVals)}
y.loess <- loess(varVals ~ varTimes, span=0.75)
return(predict(y.loess, ratDF$Tijd))
}

i teraz chcialabym tworze nowe dane z tych imputacji (pewnie mozna by to w funkcji zrobic ale nie wiem jak wiec robie recznie dla wszystkich zmiennych) w ten sposob:
ds$Ammo2 <- ifelse(is.na(ds$Ammo), ds$AmmoI, ds$Ammo)
czy ktos wie jak napisac ta funkcje?

a potem mam tu funkcje ktore liczy model liniowy:

get.stat <- function(ratid, varname, ds.time){
ratValues <- subset(ds.time, Rat==ratid)
varVals <- ratValues[,varname];
varTimes <- ratValues$Tijd
#value1 <- values[1,1]
if(sum(!is.na(varVals)) < 2) {return(c(ratid, NA, NA, ratValues$survtime[1], ratValues$gr[1]))}
lmmodel<-lm(varVals ~ varTimes)
return(c(ratid, lmmodel$coeff[1], lmmodel$coeff[2], ratValues$survtime[1], ratValues$gr[1]))}

i funkcja ktora tworzy dane do analizy:

get.stats <- function(varname, ds, timeMax){
ds.time <-subset(ds, Tijd < timeMax, select=c("Rat", "Tijd", varname, "group", "survtime"))
return(sapply(unique(ds.time$Rat), get.stat, varname, ds.time))}


teraz chcialabym miec funkcje ktora wezmie do analizy zmienne i policzy get.stats dla roznych timeMax, recznie to wyglada tak:
variable <- c("AmmoI","KreatinineI","BilitI","HbI","HEI","MAP","AST")
timeMax<-3

# w nastepnych krokach timeMax jest 6, 9, 12, 15

statAmmoI <- as.data.frame(t(get.stats("AmmoI", ds, timeMax)))
names(statAmmoI) <- c("ID", "s1AmmoI", "BetaAmmoI", "SurvT", "Group")

i tak robie dla wszystkich zmiennych recznie, moze ktos moze mi pomoc napisac ta funkcje?
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

Witaj Wojciech tak jak napisales o tym kroliku z kapelusza, to masz racje bo moj profesor cos non stop dorzuca i taki zamysl powstal, zamiescilam w osobnym poscie R kod z tym modelem lm moze bedziesz wiedzial o co chodzi jak zobaczysz kod, ja sama tak troszke srednio sie jeszcze w tym lapie. Bede wdzieczna za kazda pomoc.
Wojciech Sobala:
Funkcja lme i predykcja zmiennej to trochę taki królik z kapelusza, ponieważ wcześniej o tym nie wspominałaś.
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

Czy możesz podać link do tego postu?
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

jak podac link do postu? ten post jest jest na tej samej stronie.
Wojciech Sobala:
Czy możesz podać link do tego postu?
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

Funkcja impute.var uzupełnia brakujące dane wartością oczekiwaną zamiast generowaną z rozkładu warunkowego. W przypadku niewielkiej ilości braków danych takie podejście nie prowadzi do zbyt dużych błędów we wnioskowaniu na podstawie tak generowanych danych ale gdy braków jest nieco więcej to takie podejście do imputacji nie jest prawidłowe.
Czy do imputacji nie lepiej użyć gotowego pakietu (np. mice)?
Kama Jansen

Kama Jansen Student, Akademia
Medyczna w
Amsterdamie

Temat: Survival analysis / Analiza przezycia / Cox regression

Dzieki Wojciech, faktycznie mice mogloby tu byc dobrym rozwiazaniem, dziala fajnie, ale mam pewien problem. Dla calego zestawu danych mozna by zrobic
imp <- mice(ds)
complete(imp)

ale problem jest taki ze moj zestaw danych ds to zlepek danych dla poszczegolnych pacjentow:
head(ds, n=15)
Rat Tijd HE MAP Ammo Kreatinine AST Bilitotaal Hb gr survtime
1 38 0 NA NA NA NA NA NA NA 1 8.5
2 38 1 0 66 690 20 120 3 17.9 1 8.5
3 38 2 1 91 885 24 3805 2 13.1 1 8.5
4 38 3 1 87 NA NA NA NA NA 1 8.5
5 38 4 3 45 770 34 30000 7 8.6 1 8.5
6 38 5 3 69 730 NA NA NA NA 1 8.5
7 38 6 4 57 1035 40 30000 19 8.8 1 8.5
8 38 7 5 68 1055 NA NA NA NA 1 8.5
9 38 8 5 60 1235 64 30000 26 8.8 1 8.5
10 38 9 5 60 NA 64 NA 2 NA 1 8.5
11 40 0 0 NA 205 19 100 2 NA 1 10.5
12 40 1 0 NA NA NA NA NA NA 1 10.5
14 40 3 1 57 NA NA NA NA NA 1 10.5
15 40 4 2 59 595 39 10930 10 10.0 1 10.5
16 40 5 3 129 675 NA NA NA NA 1 10.5
17 40 6 3 138 935 41 30375 23 10.3 1 10.5

nie moge dla calego ds zrobic mice bo dla linijki 10 zaimputowana wartosc "Ammo" byla by policzona w oparciu o wartosci z rzedow powyzszych i ponizszych a to jest tak naprawde ostatnia wartosc dla Rat10
wiec musi byc nieco wieksza niz 1235 a nie lezec gdzies pomiedzy 1235 a 205

wiec trzeba by bylo zrobic to mice w funkcji zeby liczone byly imputacje dla kazdego Rat osobno, cos takiego:

imputemice.var <- function(ratid, ds){
ratDF <-subset(ds, Rat==ratid)
imp <- mice(ratDF)
complete(imp)
}

mozesz spojrzec Wojciech jak zrobic z tych elementow dla poszczegolnych ratid jeden zestaw zaimputowanych danych?
bede wdzieczna za pomoc

> Wojciech Sobala:
Funkcja impute.var uzupełnia brakujące dane wartością oczekiwaną zamiast generowaną z rozkładu warunkowego. W przypadku niewielkiej ilości braków danych takie podejście nie prowadzi do zbyt dużych błędów we wnioskowaniu na podstawie tak generowanych danych ale gdy braków jest nieco więcej to takie podejście do imputacji nie jest prawidłowe.
Czy do imputacji nie lepiej użyć gotowego pakietu (np. mice)?Kama Jansen edytował(a) ten post dnia 19.06.12 o godzinie 14:11
Wojciech Sobala

Wojciech Sobala Redaktor
statystyczny,
biostatystyk,
Instytut Medycyny
Pr...

Temat: Survival analysis / Analiza przezycia / Cox regression

Do imputacji w tym przypadku najlepiej użyć metody "2l.norm". Metodę imputacji można ustawić przy pomocy parametru meth funkcji mice. Dodatkowo trzeba specjalnie przygotować macierz predyktorów. Macierz predyktorów (z wartościami domyślnymi) można utowrzyć przy użyciu funkcji quickpred. Macierz tą następnie należy zmodyfikować wpisując kod -2 dla zmiennej grupującej obserwacje (w twoim przypadku ratid).
Innym sposobem jest skorzystanie z metody "norm" dla imputacji i dodanie jako predyktora zmiennej grupującej (tylko w tym przypadku ta zmienna powinna być zdefiniowana jako factor).
W pełni możesz odtworzyć to co próbowałaś zrobić osobno dla każdego szczura dodając do listy predyktorów interakcję ratid i Tijd ale niestety w tym przypadku trzeba macież dla interakcji zbudować "ręcznie" (skorzystanie z metody 2l.norm tego nie wymaga).

Następna dyskusja:

cox regression




Wyślij zaproszenie do