首页 > 解决方案 > 如何修改我的代码以包含循环?

问题描述

我正在尝试创建一个函数来检查具有不同分布的变量如何影响 OLS 结果。我创建了两个 DV(y1 和 y2),但想将其扩展为包括五个左右。我正在尝试更改我的代码以包含一个循环,因此我不必多次复制和粘贴它,但我运气不佳。任何建议将不胜感激。

library(psych)
library(arm)
library(plyr)
library(fBasics)

regsim <- function(iter, n) {
ek1 <- rnorm(n, 0, 1) 
ek2 <- rnorm(n, 0, 5) 
x <- rnorm(n, 0, .5)

y1 <- .3*x + ek1
y2 <- .3*x + ek2

#y1
lm1 <- lm(y1 ~ x)
bhat1 <- coef (lm1)[2]
sehat1 <- se.coef (lm1) [2] 
skewy1 <- skew(y1)
stdevy1 <- stdev(y1)

#y2
lm2 <- lm(y2 ~ x)
bhat2 <- coef (lm2)[2]
sehat2 <- se.coef (lm2) [2] 
skewy2 <- skew(y2)
stdevy2 <- stdev(y2)


results <- c(bhat1, sehat1, stdevy1, skewy1,
         bhat2, sehat2, stdevy2, skewy2)
names(results) <- c('b1', 'se1', 'sdy1', 'skewy1',
                'b2', 'se2', 'sdy2', 'skewy2')
return(results)
}


iter <-1000
n <-500


results <- NULL
sims <-ldply(1:iter, regsim, n)
sims$n <- n
results <- rbind(results, sims)

标签: rloops

解决方案


这减少了对包的依赖,只psych::skew需要一个可选的ggplot2调用:

library(psych)

regsim <- function(n, eks) {
  x <- rnorm(n, 0, .5)
  ek <- sapply(eks, function(x) rnorm(n, 0, x))
  y <- 0.3 * x + ek

  lms <- lm(y ~ x)

  data.frame(b_hat = lms[['coefficients']][2,],
             int = lms[['coefficients']][1, ],
             skew_y = psych::skew(y),
             se_hat = unlist(lapply(summary(lms), function(lst) lst[[4]][2,2]), use.names = FALSE),
             sd_y = apply(y, 2, sd),
             sd_eks = eks
             )
}

iter <-1000
n <-500

eks_sd = c(1,5)

# do the simulations and make them into a nice data.frame
sims <- replicate(iter, regsim(n, eks_sd), simplify = FALSE)
results <- do.call(rbind, sims)

#next parts are optional
results$iter_id <- rep(seq_len(iter), each = length(eks_sd))
tibble::as_tibble(results)

# Random graph because everyone loves graphs
library(ggplot2)
ggplot(results, aes(x = iter_id, y = int)) + geom_point() + facet_grid(vars(sd_eks))

主要的是lm可以接受多个y参数。这就是我们创建使用矩阵的ek原因sapply

在此处输入图像描述


推荐阅读