Rzeczywiście ma jasne wyjaśnienie teorii, jak to działa, wraz z pięknym przykładem. (Dziękuję za to, jest to niezły zasób, którego użyję w mojej pracy).
Aby użyć funkcji curve
, musisz przekazać jakąś funkcję jako argument. To prawda, że rodzina funkcji używa innej parametryzacji dla Weibulla niż survreg
, ale może być łatwo przekształcona, jak wyjaśniono w pierwszym linku. Ponadto z dokumentacji pod numerem survreg
:
Istnieje wiele sposobów parametryzowania rozkładu Weibulla. Funkcja survreg umieszcza ją w rodzinie o ogólnym przybliżeniu, która jest inną parametryzacją niż funkcja rweibull i często prowadzi do pomyłki w przypadku .
survreg's scale = 1/(rweibull shape)
survreg's intercept = log(rweibull scale)
Oto implementacja tej prostej transformacji:
# The parameters
intercept<-4.0961
scale<-1.15
par(mfrow=c(1,2),mar=c(5.1,5.1,4.1,2.1)) # Make room for the hat.
# S(t), the survival function
curve(pweibull(x, scale=exp(intercept), shape=1/scale, lower.tail=FALSE),
from=0, to=100, col='red', lwd=2, ylab=expression(hat(S)(t)), xlab='t',bty='n',ylim=c(0,1))
# h(t), the hazard function
curve(dweibull(x, scale=exp(intercept), shape=1/scale)
/pweibull(x, scale=exp(intercept), shape=1/scale, lower.tail=FALSE),
from=0, to=100, col='blue', lwd=2, ylab=expression(hat(h)(t)), xlab='t',bty='n')
par(mfrow=c(1,1),mar=c(5.1,4.1,4.1,2.1))
Rozumiem, że pan wspomniał w swojej odpowiedzi, że nie chcesz korzystać z funkcji pweibull
, ale Zgaduję, że nie chcesz go używać, ponieważ używa innej parametryzacji. W przeciwnym razie, można po prostu napisać własną wersję pweibull
korzystające z tego survreg
jest parametryzacja:
my.weibull.surv<-function(x,intercept,scale) pweibull(x,scale=exp(intercept),shape=1/scale,lower.tail=FALSE)
my.weibull.haz<-function(x,intercept,scale) dweibull(x, scale=exp(intercept), shape=1/scale)/pweibull(x,scale=exp(intercept),shape=1/scale,lower.tail=FALSE)
curve(my.weibull.surv(x,intercept,scale),1,100,lwd=2,col='red',ylim=c(0,1),bty='n')
curve(my.weibull.haz(x,intercept,scale),1,100,lwd=2,col='blue',bty='n')
Jak wspomniano w komentarzach, nie wiem dlaczego chcesz to zrobić (chyba że jest to praca domowa), ale można handcode pweibull
i dweibull
jeśli chcesz:
my.dweibull <- function(x,shape,scale) (shape/scale) * (x/scale)^(shape-1) * exp(- (x/scale)^shape)
my.pweibull <- function(x,shape,scale) exp(- (x/scale)^shape)
definicje te pochodzą prosto z ?dweibull
. Teraz po prostu zapisz te, wolniejsze, nieprzetestowane funkcje zamiast pweibull
i dweibull
bezpośrednio.
Niż ks dla twojej rozbudowanej wiadomości e-mail, ale NIE chcę używać żadnej funkcji '* weibull'. Czy możliwe jest wyrażenie zagrożenia w funkcji "przecięcia", "wieku (+ innych współzmiennych)" i "skali"? –
Hm, może przegapiłeś mój ostatni akapit, w którym pokażę ci, jak napisać funkcję, która jest po prostu owijką 'pweibulla'. Nie wiem, dlaczego chciałbyś przepisać 'pweibull', ponieważ jest on kodowany w C, i jest bardzo szybki i dobrze przetestowany. Chyba że to tylko praca domowa. W każdym razie pokażę ci, jak ręcznie kręcić "pweibull" i "dweibull". – nograpes
Myślę, że OP brakuje w połączeniu matematycznym między wyjściem R a funkcją zagrożenia/przeżycia – ECII