【问题标题】:R: Creating a loop for two models?R:为两个模型创建一个循环?
【发布时间】:2016-10-29 23:03:45
【问题描述】:

我目前有以下代码,其中包含两个函数,用于计算适合两个不同模型的模型。区别在于 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

【问题讨论】:

标签: r function loops model regression


【解决方案1】:

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

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 列表随后可用于 predict 和 new.data。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多