2015-09-28 16 views
7

In R, utilizzando il pacchetto np, ho creato le larghezze di banda per una densità condizionale. Quello che mi piacerebbe fare è, dato qualche nuovo vettore condizionale, campionare dalla distribuzione risultante.È possibile campionare da una densità condizionale in R dati alcuni dati condizionali?

codice attuale:

library('np') 
# Generate some test data. 
somedata = data.frame(replicate(10,runif(100, 0, 1))) 
# Conditional variables. 
X <- data.frame(somedata[, c('X1', 'X2', 'X3')]) 
# Dependent variables. 
Y <- data.frame(somedata[, c('X4', 'X5', 'X6')]) 
# Warning, this can be slow (but shouldn't be too bad). 
bwsome = npcdensbw(xdat=X, ydat=Y) 
# TODO: Given some vector t of conditional data, how can I sample from the resulting distribution? 

Sono abbastanza nuovo per R, così mentre ho letto la documentazione del pacchetto, non sono stato in grado di capire se ciò che la visione ha un senso o è possibile. Se necessario, utilizzerei volentieri un altro pacchetto.

+0

Ottengo: 'Errore: impossibile trovare la funzione" npcedensbw "'. Se guardo le funzioni disponibili nel pacchetto np, non vedo niente con quel nome. Quando eseguo nuovamente con 'npcdensbw' e quindi' trama' il risultato, vedo 6 X vatriable. Ora ... quale era esattamente la domanda? –

+0

Infatti, sto lavorando con dati multivariati, sia nelle variabili condizionali che dipendenti. Quello che mi piacerebbe fare è campionare dalla distribuzione determinata. Dato un nuovo vettore per le variabili condizionali/indipendenti, voglio campionare in base alla distribuzione data le variabili condizionali. In un esempio più semplice, se entrambi xey erano mono dimensionali, vorrei correggere x in modo tale che ci sia una distribuzione su y, e quindi campionare all'interno di quella distribuzione. Voglio fare la stessa cosa qui. È più chiaro? – gdoug

+0

Giusto per essere sicuro di aver compreso correttamente la domanda: in che modo il tuo caso si discosta dalla FAQ 2.49 in https://cran.r-project.org/web/packages/np/vignettes/np_faq.pdf? – coffeinjunky

risposta

2

Qui è l'esempio da 2.49: https://cran.r-project.org/web/packages/np/vignettes/np_faq.pdf, dà la soluzione segue per per 2 variabili:

### 
library(np) 
data(faithful) 
n <- nrow(faithful) 
x1 <- faithful$eruptions 
x2 <- faithful$waiting 
## First compute the bandwidth vector 
bw <- npudensbw(~x1 + x2, ckertype = "gaussian") 
plot(bw, view = "fixed", ylim = c(0, 3)) 
## Next generate draws from the kernel density (Gaussian) 
n.boot <- 1000 
i.boot <- sample(1:n, n.boot, replace = TRUE) 
x1.boot <- rnorm(n.boot,x1[i.boot],bw$bw[1]) 
x2.boot <- rnorm(n.boot,x2[i.boot],bw$bw[2]) 
## Plot the density for the bootstrap sample using the original 
## bandwidths 
plot(npudens(~x1.boot+x2.boot,bws=bw$bw), view = "fixed") 

seguendo questo suggerimento da @coffeejunky, quanto segue è una possibile soluzione al vostro problema con 6 variabili:

## Generate some test data. 
somedata = data.frame(replicate(10, runif(100, 0, 1))) 
## Conditional variables. 
X <- data.frame(somedata[, c('X1', 'X2', 'X3')]) 
## Dependent variables. 
Y <- data.frame(somedata[, c('X4', 'X5', 'X6')]) 
## First compute the bandwidth vector 
n <- nrow(somedata) 
bw <- npudensbw(~X$X1 + X$X2 + X$X3 + Y$X4 + Y$X5 + Y$X6, ckertype = "gaussian") 
plot(bw, view = "fixed", ylim = c(0, 3)) 
## Next generate draws from the kernel density (Gaussian) 
n.boot <- 1000 
i.boot <- sample(1:n, n.boot, replace=TRUE) 
x1.boot <- rnorm(n.boot, X$X1[i.boot], bw$bw[1]) 
x2.boot <- rnorm(n.boot, X$X2[i.boot], bw$bw[2]) 
x3.boot <- rnorm(n.boot, X$X3[i.boot], bw$bw[3]) 
x4.boot <- rnorm(n.boot, Y$X4[i.boot], bw$bw[4]) 
x5.boot <- rnorm(n.boot, Y$X5[i.boot], bw$bw[5]) 
x6.boot <- rnorm(n.boot, Y$X6[i.boot], bw$bw[6]) 
## Plot the density for the bootstrap sample using the original 
## bandwidths 
ob1 <- npudens(~x1.boot + x2.boot + x3.boot + x4.boot + x5.boot + x6.boot, bws = bw$bw) 
plot(ob1, view = "fixed", ylim = c(0, 3)) 
+0

Questo esempio mostra una stima della densità incondizionata del kernel (usando 'npudensbw'), ma non per una stima della densità condizionale del kernel (che userebbe' npcdensbw'). Forse c'è un modo semplice per adattare questo codice per provare questo, ma non lo vedo ben documentato nei file di aiuto di 'np' e darei una risposta chiara per questo particolare aspetto della domanda. –