2015-05-15 110 views
1

我想遍歷引用不同數據子集的各種迴歸,但是我無法適當地調用不同的子集。例如:循環遍歷R中的lm()中的各種數據子集

dat <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10)) 
x.list <- list(dat$x1,dat$x2,dat$x3) 
dat1 <- dat[-9,] 

fit <- list() 
for(i in 1:length(x.list)){ fit[[i]] <- summary(lm(y ~ x.list[[i]], data = dat))}   
for(i in 1:length(x.list)){ fit[[i]] <- summary(lm(y ~ x.list[[i]], data = dat1))}   

有沒有辦法調用「dat1」,以便它相應地分組其他變量?感謝任何recs。

回答

4

我不確定將您的協變量複製到新的列表中是否有意義。這裏有一種方法來循環列和dynimcally建立公式

dat <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10)) 
dat1 <- dat[-9,] 
#x.list not used 

fit <- list() 
for(i in c("x1","x2","x3")){ fit[[i]] <- summary(lm(reformulate(i,"y"), data = dat))} 
for(i in c("x1","x2","x3")){ fit[[i]] <- summary(lm(reformulate(i,"y"), data = dat1))} 
0

這個怎麼樣?

dat <- data.frame(y = rnorm(10), x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10)) 
mods <- lapply(list(y ~ x1, y ~ x2, y ~ x3), lm, data = dat1) 

如果你有很多預測的,建立的公式是這樣的:通過分割數據使用lapply

lapply(paste('y ~ ', 'x', 1:10, sep = ''), as.formula) 

如果你的數據在長格式,這將是同樣簡單的事。幀。

dat <- data.frame(y = rnorm(30), x = rnorm(30), f = rep(1:3, each = 10)) 
lapply(split(dat, dat$f), function(x) lm(y ~ x, data = x)) 
0

對不起遲到了 - 但你試過類似data.table解決方案適用於您在:

R data.table loop subset by factor and do lm()

我剛纔通過改變你的數據應用的鏈接的解決方案,應該說明我如何理解你的問題:

set.seed(1) 

df <- data.frame(x1 = letters[1:3], 
       x2 = sample(c("a","b","c"), 30, replace = TRUE), 
       x3 = sample(c(20:50), 30, replace = TRUE), 
       y = sample(c(20:50), 30, replace = TRUE)) 
dt <- data.table(df,key="x1") 

fits <- lapply(unique(dt$x1), 
       function(z)lm(y~x2+x3, data=dt[J(z),], y=T)) 

fit <- dt[, lm(y ~ x2 + x3)] 

# Using id as a "by" variable you get a model per id 
coef_tbl <- dt[, as.list(coef(lm(y ~ x2 + x3))), by=x1] 
# coefficients 
sapply(fits,coef) 

anova_tbl = dt[, as.list(anova(lm(y ~ x2 + x3))), by=x1] 
row_names = dt[, row.names(anova(lm(y ~ x2 + x3))), by=x1] 
anova_tbl[, variable := row_names$V1] 

它擴展了你的解決方案。