我有一个数据帧(df),如下所示:
group.no Amount Response
1 5 10
1 10 25
1 2 20
2 12 20
2 4 8
2 3 5
我已经根据其组号将data.frame分为几个数据
out <- split( df , f = df$group.no )
现在我想要的是对所有“新”数据中的lm〜响应之间进行lm回归分析。 请考虑这是一个示例,我在“ out”中有500个分割的data.frames
答案 0 :(得分:1)
假定末尾的注释中可重复显示的数据。如果您不想合并标准错误,请指定pool = FALSE
作为lmList
参数。
# 1
library(nlme)
lmList(Response ~ Amount | group.no, DF)
替代方法是:
# 2
lm(Response ~ grp / (Amount + 1) - 1, transform(DF, grp = factor(group.no)))
或执行完全独立的回归的该操作:
# 3
by(DF, DF$group.no, function(DF) lm(Response ~ Amount, DF))
最后一行也可以写成:
# 3a
by(DF, DF$group.no, lm, formula = Response ~ Amount)
我们可以使用以下任意一种来按组计算R平方:
summary(lmList(Response ~ Amount | group.no, DF))$r.squared
c(by(DF, DF$group.no, function(x) summary(lm(Response ~ Amount, x))$r.squared))
reg.list <- by(DF, DF$group.no, lm, formula = Response ~ Amount)
sapply(reg.list, function(x) summary(x)$r.squared)
c(by(DF, DF$group.no, with, cor(Response, Amount)^2))
library(dplyr)
DF %>%
group_by(group.no) %>%
do(summarize(., r.squared = summary(lm(Response ~ Amount, .))$r.squared)) %>%
ungroup
Lines <- "group.no Amount Response
1 5 10
1 10 25
1 2 20
2 12 20
2 4 8
2 3 5"
DF <- read.table(text = Lines, header = TRUE)
答案 1 :(得分:0)
根据要对回归进行的处理,可以使用magrittr
或dplyr
进行拆分,然后创建线性回归列表:
library(magrittr) #alternative library(dplyr)
df %>% split(.$group.no) %>% lapply(function(x) lm(Amount ~ Response, data = x))
如果您希望避免使用dplyr
语法,则可以将单个lapply
调用用作
lapply(split(df, df$group.no), function(x) lm(Amount ~ Response, data = x))
答案 2 :(得分:0)
out
是数据帧的列表,因此您可以使用lapply()
来估计每个数据帧的回归。
mods <- lapply(out, lm, formula=y~x)
然后mods
将是模型的列表。