R:为两个模型创建一个循环?

时间:2016-06-27 20:03:40

标签: r function loops model regression

我目前有以下代码,其中包含两个函数,用于计算适合两个不同模型的模型。不同之处在于 lm 功能,其中 + log(v2)已添加到模型2中。

R代码

dat <- data.frame(clicks = runif(30, 1, 100), v1 = runif(30, 1, 100), v2 = runif(30, 1, 100))
p0 <- 1  # number of parameters in lm()
p1 <- 2  # number of parameters in lm()
n <- nrow(dat) - 1

## Model 1 Loop
model1 <- function(x) {
  fit <- lm(log(clicks) ~ log(v1), data = dat, subset = 1:x, model = FALSE)
  pred <- predict(fit, newdata = dat[x+1, ])
  c(summary(fit)$r.squared)
}

## Model 1 Regression
result_m1 <- t(sapply(p0:n, model1))
data.frame(result_m1)

## Model 2 Loop
model2 <- function(x) {
  fit <- lm(log(clicks) ~ log(v1) + log(v2), data = dat, subset = 1:x, model = FALSE)
  pred <- predict(fit, newdata = dat[x+1, ])
  c(summary(fit)$r.squared)
}

## Model 2 Regression
result_m2 <- t(sapply(p1:n, model2))
data.frame(result_m2)

问题:我能以某种方式创建一个仅为不同模型实现循环的函数,而不是为每个模型重复计算吗?

我有这样的想法,但无法实现它。http://www.ats.ucla.edu/stat/r/pages/looping_strings.htm

1 个答案:

答案 0 :(得分:0)

我没有看到重新创建一个可以通过可用包中的模型选择功能轻松完成的功能。

library(leaps)
library(dplyr)

b <- regsubsets(clicks ~ ., data=dat, nbest=10, nvmax=2) # carries out exhaustive model selection (10 best models; 2 maximum predictors)

coef(b, 1:3) # returns coefficient for the 3 models in this case
[[1]]
(Intercept)          v1 
 60.8067570  -0.2665699 

[[2]]
(Intercept)          v2 
49.96974177 -0.05227489 

[[3]]
(Intercept)          v1          v2 
62.02323816 -0.26422966 -0.02676747 


summary(b)$rsq #provide r.squared value for 3 models
[1] 0.067952759 0.002366681 0.068568059

运行预测有点复杂。

all.mods <- summary(b)$which[,-1] # gives logic output of predictors combination
all.mods
     v1    v2
1  TRUE FALSE
1 FALSE  TRUE
2  TRUE  TRUE

RHS <- lapply(seq(nrow(all.mods)), function(m) summary(b)$which[m,-1] %>% which %>% names %>% paste(., collapse="+"))
RHS
[[1]]
[1] "v1"

[[2]]
[1] "v2"

[[3]]
[1] "v1+v2"

lm.form <- lapply(RHS, function(m)parse(text=paste("lm(clicks ~", m, ", data=dat)"))) 
lm.mods <- lapply(lm.form, eval) # return list of all lm.mods generated

lm.mods列表随后可用于{d}的predict