Добавление доверительных интервалов для построения графика из данных моделирования в R

Я создал пробит-симуляцию, основанную на функции правдоподобия и симуляции, и все это можно воспроизвести с помощью приведенного ниже кода.

Это функция правдоподобия:

probit.ll <- function(par,ytilde,x) {
   a <- par[1] 
   b <- par[2]
 return(  -sum( pnorm(ytilde*(a + b*x),log=TRUE) ))
}

Это функция для выполнения оценок:

my.probit <- function(y,x) {
# use OLS to get start values
par <- lm(y~x)$coefficients
ytilde <- 2*y-1
# Run optim 
res <- optim(par,probit.ll,hessian=TRUE,ytilde=ytilde,x=x)
# Return point estimates and SE based on the inverse of Hessian
names(res$par) <- c('a','b')
se=sqrt(diag(solve(res$hessian)))
names(se) <- c('a','b')
return(list(par=res$par,se=se,cov=solve(res$hessian)))
}

И это функция для создания моделируемой модели:

probit.data <- function(N=100,a=1,b=1) {
x <- rnorm(N)
y.star <- a + b*x + rnorm(N)
y <- (y.star > 0)
return( as.data.frame(cbind(y,x,y.star)) )
}

Это имитирует размер n, равный 100:

probit.data100 <- function(N=100,a=2,b=1) {
x <- rnorm(N)
y.star <- a + b*x + rnorm(N)
y <- (y.star > 0)
return( as.data.frame(cbind(y,x,y.star)) )
}

#predicted value
se.probit.phat100 <- function(x, par, V) {
z <- par[1] + par[2] * x
# Derivative of q w.r.t. alpha and beta 
J <- c( dnorm(z), dnorm(z)*par[2] )
return( sqrt(t(J) %*% V %*% J)  )
}

dat100 <- probit.data100()
res100 <- my.probit(dat100$y,dat100$x)
res100

Эта функция ниже вычислит доверительные интервалы на основе непараметрического метода начальной загрузки (обратите внимание на используемую функцию-образец):

N <- dim(probit.data(N=100, a=1, b=1))[1]
npb.par <- matrix(NA,100,2)
colnames(npb.par) <- c("alpha","beta")
npb.eystar <- matrix(NA,100,N)
for (t in 1:100) {
thisdta <- probit.data(N=100, a=1, b=1)[sample(1:N,N,replace=TRUE),]
npb.par[t,] <- my.probit(thisdta$y,thisdta$x)$par
}

Эта функция ниже просто очищает вывод начальной загрузки, а доверительные интервалы - это то, что я хотел бы построить:

processres <- function(simres) {
z <- t(apply(simres,2,function(x) { c(mean(x),median(x),sd(x),quantile(x,c(0.05,0.95)))     } ))
rownames(z) <- colnames(simres)
colnames(z) <- c("mean","median","sd","5%","95%")
z
}

processres(npb.par)

Я хотел бы построить такой график (тот, что ниже), но добавить доверительные интервалы на основе функции processres выше. Как можно добавить эти доверительные интервалы к графику?

x <- seq(-5,5,length=100)
plot(x, pnorm(1 - 0.5*x), ty='l', lwd=2, bty='n', xlab='x', ylab="Pr(y=1)")
rug(dat100$x)

Я также открыт для другого кода сюжета и / или пакета. Мне просто нужен график на основе этой симуляции с добавленными доверительными интервалами.

Спасибо!


person Captain Murphy    schedule 06.02.2012    source источник


Ответы (1)


Вот способ добавить закрашенный CI на основе результатов моделирования:

ОБНОВЛЕНИЕ: теперь это строит ожидаемую кривую (т.е. с использованием средних значений альфа и бета) и правильно передает эти значения в rnorm.

x <- seq(-5,5,length=100)
plot(x, pnorm(1 - 0.5*x), ty='n', lwd=2, bty='n', xlab='x', ylab="Pr(y=1)", 
     xaxs = 'i', ylim=c(0, 1))

params <- processres(npb.par)
sims <- 100000
sim.mat <- matrix(NA, ncol=length(x), nrow=sims)
for (i in 1:sims) {
  alpha <- rnorm(1, params[1, 1], params[1, 3])
  beta <- rnorm(1, params[2, 1], params[2, 3])
  sim.mat[i, ] <- pnorm(alpha - beta*x)
}

CI <- apply(sim.mat, 2, function(x) quantile(x, c(0.05, 0.95)))
polygon(c(x, rev(x)), c(CI[1, ], rev(CI[2, ])), col='gray', border=NA)
lines(x, pnorm(params[1, 1] - params[2, 1]*x), lwd=2)
rug(dat100$x)
box()

результат

person jbaums    schedule 07.02.2012
comment
Спасибо, jbaums, выглядит отлично! - person Captain Murphy; 07.02.2012