Il first link you provided ha in realtà una spiegazione chiara sulla teoria di come funziona, insieme a un esempio piacevole. (Grazie per questo, è una buona risorsa che userò nel mio lavoro.)
Per utilizzare la funzione curve
, è necessario passare alcune funzioni come argomento. È vero che la famiglia di funzioni *weibull
utilizza una parametrizzazione diversa per Weibull rispetto a survreg
, ma può essere facilmente trasformata, come spiegato nel primo collegamento. Inoltre, dalla documentazione in survreg
:
Esistono diversi modi per parametrizzare una distribuzione di Weibull. La funzione superstite la impregna in una famiglia di scala di posizione generale, che è una parametrizzazione diversa da rispetto alla funzione rweibull e spesso porta a confusione lo .
survreg's scale = 1/(rweibull shape)
survreg's intercept = log(rweibull scale)
Ecco un'implementazione di quella semplice trasformazione:
# 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))
Capisco che lei ha citato nella sua risposta che non volevi usare la funzione pweibull
, ma Immagino che non volessi usarlo perché utilizza una parametrizzazione diversa. In caso contrario, si potrebbe semplicemente scrivere il proprio versione di pweibull
che utilizza tale parametrizzazione survreg
s':
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')
Come ho già detto nei commenti, non so il motivo per cui si dovrebbe fare questo (a meno che non si tratta di compiti a casa), ma si potrebbe handcode pweibull
e dweibull
se ti piace:
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)
Tali definizioni vengono direttamente dalla ?dweibull
. Ora basta avvolgere quelle funzioni più lente, non testate invece di pweibull
e dweibull
direttamente.
Than ks per la tua elaborata e-mail ma NON voglio usare nessuna funzione '* weibull'. È possibile esprimere il pericolo in funzione di "Intercetta", "età (+ altre covariate)" e "scala"? –
Hm, forse hai perso il mio ultimo paragrafo, dove ti mostro come scrivere una funzione che è semplicemente un wrapper di 'pweibull'. Non so perché vorresti riscrivere 'pweibull', dato che è codificato in C, ed è molto veloce e ben testato. A meno che non siano solo compiti a casa. Ad ogni modo, ti mostro come passare a mano 'pweibull' e' dweibull'. – nograpes
Penso che l'OP non tocchi la connessione matematica tra l'uscita R e la funzione pericolo/sopravvivenza – ECII