2014-05-25 4 views
3

J'ai utilisé smooth.spline pour estimer une spline cubique pour mes données. Mais quand je calcule l'intervalle de confiance de 90% par point en utilisant l'équation, les résultats semblent être un peu plus bas. Quelqu'un peut-il me dire si je l'ai fait à tort? Je me demande simplement s'il existe une fonction qui peut calculer automatiquement une bande d'intervalle ponctuelle associée à la fonction smooth.spline.Comment obtenir l'intervalle de confiance pour smooth.spline?

boneMaleSmooth = smooth.spline(bone[males,"age"], bone[males,"spnbmd"], cv=FALSE) 
error90_male = qnorm(.95)*sd(boneMaleSmooth$x)/sqrt(length(boneMaleSmooth$x)) 

plot(boneMaleSmooth, ylim=c(-0.5,0.5), col="blue", lwd=3, type="l", xlab="Age", 
    ylab="Relative Change in Spinal BMD") 
points(bone[males,c(2,4)], col="blue", pch=20) 
lines(boneMaleSmooth$x,boneMaleSmooth$y+error90_male, col="purple",lty=3,lwd=3) 
lines(boneMaleSmooth$x,boneMaleSmooth$y-error90_male, col="purple",lty=3,lwd=3) 

enter image description here

Parce que je ne sais pas si je l'ai fait correctement, alors j'utilisé gam() fonction du package mgcv.

Il a instantanément donné une bande de confiance mais je ne suis pas sûr si c'est 90% ou 95% CI ou autre chose. Ce serait génial si quelqu'un peut expliquer.

males=gam(bone[males,c(2,4)]$spnbmd ~s(bone[males,c(2,4)]$age), method = "GCV.Cp") 
plot(males,xlab="Age",ylab="Relative Change in Spinal BMD") 

enter image description here

Répondre

7

Je ne suis pas sûr que les intervalles de confiance pour smooth.spline ont « belles » intervalles de confiance comme ceux sous forme lowess font. Mais j'ai trouvé un échantillon de code à partir d'un CMU Data Analysis course pour créer des intervalles de confiance bayésiens.

Voici les fonctions utilisées et un exemple. La fonction principale est spline.cis où le premier paramètre est une trame de données où la première colonne sont les valeurs x et la deuxième colonne les valeurs y. L'autre paramètre important est B qui indique le nombre de réplications bootstrap à effectuer. (Voir le PDF lien ci-dessus pour tous les détails.)

# Helper functions 
resampler <- function(data) { 
    n <- nrow(data) 
    resample.rows <- sample(1:n,size=n,replace=TRUE) 
    return(data[resample.rows,]) 
} 

spline.estimator <- function(data,m=300) { 
    fit <- smooth.spline(x=data[,1],y=data[,2],cv=TRUE) 
    eval.grid <- seq(from=min(data[,1]),to=max(data[,1]),length.out=m) 
    return(predict(fit,x=eval.grid)$y) # We only want the predicted values 
} 

spline.cis <- function(data,B,alpha=0.05,m=300) { 
    spline.main <- spline.estimator(data,m=m) 
    spline.boots <- replicate(B,spline.estimator(resampler(data),m=m)) 
    cis.lower <- 2*spline.main - apply(spline.boots,1,quantile,probs=1-alpha/2) 
    cis.upper <- 2*spline.main - apply(spline.boots,1,quantile,probs=alpha/2) 
    return(list(main.curve=spline.main,lower.ci=cis.lower,upper.ci=cis.upper, 
    x=seq(from=min(data[,1]),to=max(data[,1]),length.out=m))) 
} 

#sample data 
data<-data.frame(x=rnorm(100), y=rnorm(100)) 

#run and plot 
sp.cis <- spline.cis(data, B=1000,alpha=0.05) 
plot(data[,1],data[,2]) 
lines(x=sp.cis$x,y=sp.cis$main.curve) 
lines(x=sp.cis$x,y=sp.cis$lower.ci, lty=2) 
lines(x=sp.cis$x,y=sp.cis$upper.ci, lty=2) 

Et cela donne quelque chose comme

bootstrap confidence intervals

En fait, il semble qu'il y ait peut-être une façon plus paramétrique pour calculer les intervalles de confiance en utilisant la les résidus de jackknife. Ce code provient de la S+ help page for smooth.spline

fit <- smooth.spline(data$x, data$y)  # smooth.spline fit 
    res <- (fit$yin - fit$y)/(1-fit$lev)  # jackknife residuals 
sigma <- sqrt(var(res))      # estimate sd 

upper <- fit$y + 2.0*sigma*sqrt(fit$lev) # upper 95% conf. band 
lower <- fit$y - 2.0*sigma*sqrt(fit$lev) # lower 95% conf. band 
matplot(fit$x, cbind(upper, fit$y, lower), type="plp", pch=".") 

et que les résultats dans

residual CI estimate

Et pour autant que les intervalles de confiance gam vont, si vous lisez le fichier d'aide print.gam, il y a un paramètre se= avec par défaut TRUE et les docs disent

lorsque TRUE (de faille) les lignes supérieure et inférieure sont ajoutées aux tracés 1-d à 2 erreurs-types au-dessus et en-dessous de l'estimation de l'être lisse tracée tandis que pour les tracés 2-d, les surfaces aux erreurs -1 et -1 sont contournées et superposées sur le tracé de contour pour l'estimation. Si un nombre positif est fourni, ce nombre est multiplié par les erreurs standard lors du calcul des courbes d'erreur standard ou des surfaces. Voir aussi l'ombre, ci-dessous.

Vous pouvez donc ajuster l'intervalle de confiance en ajustant ce paramètre. (Ce serait dans l'appel print().

+0

La première méthode en utilisant la méthode bootstrap de sens, mais les résultats donnent des motifs complètement différents comparant à celui que je reçois de 'gam()'. Celui qui utilise les résidus jackknife donne aussi un schéma très différent et les CI dans cette parcelle sont très très cahoteux. –

+2

@YuDeng Eh bien, différentes méthodes donnent des résultats différents. Je suppose que vous devez décider si vous êtes un fréquentiste ou un bayésien. Vous voudrez peut-être consulter un statisticien pour voir quelle méthode est la plus appropriée pour vos données. – MrFlick

3

Le package R mgcv calcule les splines de lissage et les "intervalles de confiance" bayésiens. Ce ne sont pas des intervalles de confiance au sens usuel (fréquentiste), mais des simulations numériques ont montré qu'il n'y a presque pas de différence; voir l'article lié par Marra et Wood dans le fichier d'aide de mgcv.

library(SemiPar) 
data(lidar) 
require(mgcv) 

fit=gam(range~s(logratio), data = lidar) 
plot(fit) 
with(lidar, points(logratio, range-mean(range))) 

enter image description here

Questions connexes