0

我使用 for 循环将 100 个线性模型和 100 个二次模型拟合到相同的合成数据。

我想(随机)提取 5 个线性拟合和 5 个二次拟合,并将这些回归函数与真实模型的均值函数一起绘制。

到目前为止我的想法:

  1. 选择 10 个随机数
  2. 创建一个容器(数据框?)来容纳 10 个模型
  3. 进入 for 循环,获取拟合,如果第 i 次迭代来自一组随机数,则将该模型保存在容器中。
  4. 退出 for 循环,将容器中的所有拟合与真实模型一起绘制

我遇到的主要困难是查看如何为“lm”类创建一个空数据框。

在 for 循环之前,构建容器,

fit.container.linear <- list()
fit.container.quadratic <- list()

并为将进入容器的模型随机选择索引

randy.linear <- sample(1:100,5,replace=F) 
randy.quadratic <- sample(1:100,5,replace=F) 

然后在 for 循环中,我使用 lm 得到一个线性和二次模型。model.1 是线性的。model.2 是二次的。现在在 for 循环中,我将模型存储在容器中

for (k in 1:length(randy.linear)){
    if (i == randy.linear[k]){
        fit.container.linear <- list(fit.container.linear,model.1)
    }
    }

for (p in 1:length(randy.quadratic)) {
    if (i == randy.linear[p]){
        fit.container.quadratic <- list(fit.container.quadratic,model.2)
    }
}

退出 for 循环。

现在我想访问保存系数的容器,并将所有内容绘制在一张图上。

4

1 回答 1

0

我会将所有模型存储在一个列表中,然后将它们编入索引。

lin_mods <- vector(mode = "list", length = 100)
quad_mods  <- vector(mode = "list", length = 100)

for(i in 1:100){
    # ....
    lin_mods[[i]]  <- model.1
    quad_mods[[i]] <- model.2
}

randy_linear    <- sample(1:100, 5, replace=F) 
randy_quadradic <- sample(1:100, 5, replace=F)

rand_lin_mods  <- lin_mods[randy_linear]
rand_quad_mods <- quad_mods[randy_quadradic]

至于绘制它们,如果不了解原始数据和预测变量,很难给出一个好的答案。你可以尝试的是:

pred_grid <- expand.grid(y = seq(min(data$y), max(data$y), length = 100)
get_fit <- function(model, newdata){
    newdata$fit <- predict(model, newdata = newdata)
    return(newdata)
}    

library(plyr)
names(randy_lin_mods) <- 1:5
names(randy_quad_mods) <- 1:5

lin_fits  <- ldply(randy_lin_mods,  get_fit, newdata = pred_grid)
quad_fits <- ldply(randy_quad_mods, get_fit, newdata = pred_grid)

现在lin_fitsquad_fits是来自模型的预测拟合的数据框。

于 2013-11-11T00:52:39.760 回答