在R中保存for循环的迭代

在R中保存for循环的迭代,r,R,我正在做一个项目,我需要收集一些线性回归的截距、斜率和R平方。因为我需要至少200个不同样本大小的样本,所以我设置了下面的代码,但它只保存了循环的最后一次迭代。关于如何记录每个循环的任何建议,以便获得我需要的所有系数和r平方 for (i in 1:5) { x <- as.data.frame(mydf[sample(1:1000,25,replace=FALSE),]) mylm <- lm(spd66305~spd66561, data=x) coefs <

我正在做一个项目,我需要收集一些线性回归的截距、斜率和R平方。因为我需要至少200个不同样本大小的样本,所以我设置了下面的代码,但它只保存了循环的最后一次迭代。关于如何记录每个循环的任何建议,以便获得我需要的所有系数和r平方

for (i in 1:5) {
  x <- as.data.frame(mydf[sample(1:1000,25,replace=FALSE),])
  mylm <- lm(spd66305~spd66561, data=x) 
  coefs <- rbind(lman(mylm))
  total.coefs <- rbind(coefs)
}
total.coefs
for(1:5中的i){

在开始循环之前,您可以编写
total.coefs记录每个循环的另一种方法是使工作具有可复制性,并保留数据集,以防出现极值、缺失值、关于数据集的新问题或其他需要调查的意外情况

这是使用iris数据集的类似情况

# create sample data
data(iris)
iris <- iris[ ,c('Sepal.Length','Petal.Length')]

# your function with data.frame fix on last line
lman <- function(mylm){
  r2 <- summary(mylm)$r.squared
  r <- sqrt(r2)
  intercept <- coef(mylm)[1]
  slope <- coef(mylm)[2]
  data.frame(intercept,slope,r2,r)
}

# set seed to make reproducible
set.seed(3)

# create all datasets
alldatasets <- lapply(1:200,function(x,df){
  df[sample(1:nrow(df),size = 50,replace = F), ]
},df = iris)

# create all models based on alldatasets
allmodels <- lapply(alldatasets,lm,formula = Sepal.Length ~ Petal.Length)

# run custom function on all models
lmanresult <- lapply(allmodels,lman)

# format results
result <- do.call('rbind',lmanresult)
row.names(result) <- NULL

# inspect the 129th sample, model, and result
alldatasets[[129]]
summary(allmodels[[129]])
result[129, ]
#创建示例数据
数据(iris)

iris以下是我的做法,例如在
mtcars
数据上。注意:如果您正在构建数据结构,则不建议在循环内部使用
rbind
。您可以在循环完成后调用
rbind
,而且压力小得多。我更喜欢使用列表进行此类操作

在这里,我用
rbind
包装了我的
lappy
循环,然后
do.call
递归地将列表元素绑定在一起。另一个需要注意的是,我在进入循环之前采集了样本。这使得调试更容易,总体上效率更高

reps <- replicate(3, sample(nrow(mtcars), 5), simplify = FALSE)
do.call(rbind, lapply(reps, function(x) {
    mod <- lm(mpg ~ hp, mtcars[x,])
    c(coef(mod), R = summary(mod)$r.squared)
}))
#      (Intercept)          hp         R
# [1,]    33.29360 -0.08467169 0.5246208
# [2,]    29.97636 -0.06043852 0.4770310
# [3,]    28.33462 -0.05113847 0.8514720

首先,你的函数lman不会输出任何东西,因此,从该函数返回结果没有什么意义。其次,total.coefs会被替换,并且不会在每次迭代时更新。
reps <- replicate(3, sample(nrow(mtcars), 5), simplify = FALSE)
do.call(rbind, lapply(reps, function(x) {
    mod <- lm(mpg ~ hp, mtcars[x,])
    c(coef(mod), R = summary(mod)$r.squared)
}))
#      (Intercept)          hp         R
# [1,]    33.29360 -0.08467169 0.5246208
# [2,]    29.97636 -0.06043852 0.4770310
# [3,]    28.33462 -0.05113847 0.8514720
t(vapply(reps, function(x) {
    mod <- lm(mpg ~ hp, mtcars[x,])
    c(coef(mod), R = summary(mod)$r.squared)
}, numeric(3)))