2016-07-06 9 views
0

Ich würde gerne wissen, wie man eine doppelte Schleife erstellt. In meinem Code, ich mache eine multiple Regression auf 1000 Proben (jede Stichprobe Größe: 25) Dann erstelle ich t Test Werte für jede Probe aus der 1000 mit der Nullhypothese: beta3 Wert aus der Probe = 'real' beta3 Wert . Ich kenne den "echten" beta3-Wert aus einer Monte-Carlo-Simulation (Beta 3 = Wert des dritten Koeffizienten der Regression). Der Code funktioniert jedoch bisher. Jetzt möchte ich das gleiche Verfahren für die Probengrößen 50, 100, 250, 500 und 1000 (jede Probengröße 1000 mal). Wie kann ich dieses Ziel mit einer Schleife realisieren. Ich würde mich freuen, wenn du mir helfen könntest! Hier können Sie meinen Code sehen:Wie erstelle ich eine doppelte Schleife?

n <- 25 
B <- 1000 
beta3 <- 1.01901 #'real' beta3 value 

t.test.values <- rep(NA, B) 
for(rep in 1:B){ 

##data generation 
    d1 <- runif(25, 0, 1) 
    d2 <- rnorm(25, 0, 1) 
    d3 <- rchisq(25, 1, ncp=0) 
    x1 <- (1 + d1) 
    x2 <- (3 * d1 + 0.6 * d2) 
    x3 <- (2 * d1 + 0.6 * d3) 
    exi <- rchisq(25, 5, ncp = 0) 
    y <- beta0 + beta1*x1 + beta2*x2 + beta3*x3 + exi 

## estimation 
    lmobj  <- lm(y ~ x1 + x2 + x3)   

## extraction 
    betaestim <- coefficients(lmobj)[2:4] 
    betavar <- vcov(lmobj)[2:4, 2:4] 

## t-test 
    t.test.values[rep] <- (betaestim[3] - beta3)/sqrt((betavar)[9]) 

    } 
+2

_Vier Monate_ nachdem du deine ursprüngliche Frage am 06. Juli 16 gestellt und die Antwort von @bouncyball akzeptiert hast, hast du das Q massiv am 17.NOV16 geändert. Bitte setzen Sie Ihre Änderungen zurück und senden Sie eine neue Frage. – Uwe

Antwort

0

Wir haben eine data.frame die Ergebnisse speichern können. Beachten Sie auch, dass Sie keine Werte für beta0, beta1 oder beta2 aufgenommen haben. Daher habe ich nur Platzhalterwerte verwendet.

n <- c(50,100,250,500,1000) #how big are our sample sizes? 
B <- 1000 
beta3 <- 1.01901 #'real' beta3 value 
#other beta values (note that these were not included in your question) 
beta1 <- 2 
beta2 <- 4 
beta0 <- 6 

iter <- 1 

#initialize our results data.frame 
result_df <- data.frame(sample_size = numeric(length(n) * B), 
         t.test.values = numeric(length(n) * B) 
         ) 

for(size in n){ 

for(rep in 1:B){ 

    ##data generation 
    d1 <- runif(size, 0, 1) 
    d2 <- rnorm(size, 0, 1)  
    d3 <- rchisq(size, 1, ncp=0)  
    x1 <- (1 + d1)  
    x2 <- (3 * d1 + 0.6 * d2)  
    x3 <- (2 * d1 + 0.6 * d3)  
    exi <- rchisq(size, 5, ncp = 0)  
    y <- beta0 + beta1*x1 + beta2*x2 + beta3*x3 + exi 

    ## estimation 
    lmobj  <- lm(y ~ x1 + x2 + x3)   

    ## extraction 
    betaestim <- coefficients(lmobj)[2:4] 
    betavar <- vcov(lmobj)[2:4, 2:4] 

    ## store our values 
    result_df[iter, 1] <- size 

    result_df[iter, 2] <- (betaestim[3] - beta3)/sqrt((betavar)[9]) 

    iter = iter + 1 #iterate 

    } 
} 

Solange Sie etwas verwenden, um die Iterationen zu verfolgen, eine doppelte for Schleife (I iter hier benutzt habe) ist nicht allzu schlecht. Achten Sie darauf, eine data.frame auf die richtige Größe zu initialisieren. Es kann hilfreich sein, die replicate-Funktion und die *apply-Klasse von Funktionen zu betrachten, wenn Sie mehr Simulationen planen.

Verwandte Themen