在for循环中使用随机样本

时间:2014-10-19 20:12:50

标签: r for-loop sampling

我希望从数据集中抽取1,000个大小为50的随机样本,并显示每个模拟样本的E(xi ^ ui)= 0。我的代码在下面,我一直在尝试调试一段时间,但我无法弄清楚出了什么问题。

数据集称为“数据集”,它有两列:'y'和'x'。我想在x上回归y,得到残差,并证明它们与x无关。

lm.fit <- NA
resid.lm.fit <- NA
correlation <- NA

for (i in 1:1000){
  samp1 <- sample(dataset, size=50, replace=T)
  lm.fit[i] <- lm(y ~ x, data=samp1)
  resid.lm.fit[i]<-resid(lm.fit[i])
  correlation[i] <- cor.test(resid.lm.fit[i],samp1$x)
}

我得到的错误是:

Error in resid.lm.fit[i] <- resid(lm.fit[i]) : 
  replacement has length zero
In addition: Warning message:
In lm.fit[i] <- lm(y ~ x, data = samp1) :
  number of items to replace is not a multiple of replacement length

2 个答案:

答案 0 :(得分:0)

问题是你试图在向量中存储一堆非原子对象。如果您使用lm.fitresid.lm.fitcorrelation列表而不是向量,那么您就可以了:

set.seed(123)
dataset <- data.frame(
  x=1:250,
  y=3*(1:250)+rnorm(250,0,40))
##
lm.fit <- list(NULL)
resid.lm.fit <- list(NULL)
correlation <- list(NULL)
for (i in 1:1000){
  samp1 <- dataset[sample(1:nrow(dataset), size=50, replace=T),]
  lm.fit[[i]] <- lm(y ~ x, data=samp1)
  resid.lm.fit[[i]] <- resid(lm.fit[[i]])
  correlation[[i]] <- cor.test(resid.lm.fit[[i]],samp1$x)
}

然后您可以检查单个cor.test的结果:

> correlation[[1]]

    Pearson's product-moment correlation

data:  resid.lm.fit[[i]] and samp1$x
t = 0, df = 48, p-value = 1
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2783477  0.2783477
sample estimates:
         cor 
2.991262e-17 

另外,要从data.frame使用df[ sample(1:nrow(df),...), ]进行抽样,而不是sample(df,...)

答案 1 :(得分:0)

如果dataset是数据框,那么sample(dataset, size=50, replace=T)将随机选择数据框的列50次。我假设您正在尝试挑选行。在这种情况下,dataset[sample(1:nrow(dataset), size=50, replace=T),]将解决这个问题。