user12861203
user12861203

Reputation:

simulating a simple linear model

I'm trying to simulate a simple linear model 100 times and find the LS estimation of B1 from the linear model.

set.seed(123498)
x<-rnorm(z, 0, 1)
e<-rnorm(z, 0 ,2)
y<-0.5 + 2*x + e
model<- lm(y~x)
simulaten=100
z=10

for (i in 1:simulaten){
  e<-rnorm(n, 0 ,2)
  x<-rnorm(n, 0, 1)
  y<-0.5 + 2*x + e
  model<- lm(y~x)}
  summary(model)

Is that what my for loop is achieving or have i missed the mark?

Upvotes: 1

Views: 214

Answers (2)

Rui Barradas
Rui Barradas

Reputation: 76673

Here is a replicate solution. I have set n (forgotten in the question) and simulaten to a smaller value.

n <- 100
simulaten <- 4

set.seed(123498)

model_list <- replicate(simulaten, {
      e <- rnorm(n, 0, 2)
      x <- rnorm(n, 0, 1)
      y <- 0.5 + 2*x + e
      lm(y ~ x)
}, simplify = FALSE)

model_list

Edit

Several statistics can be obtained from the models list. The coefficients are extracted with function coef applied to each model.
Done with sapply, the returned object is a 2 rows matrix.

betas <- sapply(model_list, coef)

str(betas)
# num [1:2, 1:1000] 0.671 1.875 0.374 2.019 0.758 ...
# - attr(*, "dimnames")=List of 2
#  ..$ : chr [1:2] "(Intercept)" "x"
#  ..$ : NULL

As for the graph, here is an example. Note that in order for the x axis to reach all the x values, in the first call to hist argument xlim is set to range(betas).

lgd <- c(expression(beta[0]), expression(beta[1]))
hist(betas[1, ], freq = FALSE, col = "lightblue", xlim = range(betas), ylim = c(0, 2.5), xlab = "betas", main = "")
hist(betas[2, ], freq = FALSE, col = "blue", add = TRUE)
legend("top", legend = lgd, fill = c("lightblue", "blue"), horiz = TRUE)

enter image description here

Upvotes: 1

akrun
akrun

Reputation: 887951

The model is updated in each of the iteration. So the summary is returning the summary output of the last 'model'. We could store it in a list.

# // initialize empty list of length equals length of simulaten
modellst <- vector('list', simulaten)
 for(i in seq_len(simulaten)) {
      e <- rnorm(n, 0 ,2)
      x <- rnorm(n, 0, 1)
      y <- 0.5 + 2*x + e
      # // assign the model output to the corresponding list element
      modellst[[i]] <- lm(y~x)  
 }

Upvotes: 1

Related Questions