在R中按组拟合(多个)线性模型

时间:2014-09-10 10:29:10

标签: r regression

我试图(有些)优雅地将3个模型(线性,指数和二次)拟合到具有类/因子的数据集,并为每个模型和类/因子保存p值和R2。包含3个变量的简单数据集:x,y和class。我无法弄清楚的是如何强制3个模型中的每个模型适合3个类中的每个类。我现在拥有的每个模型都适合完整的数据集。接下来的问题是我如何输出p值和& R2到表格,每个模型+类

我的代码如下:

set.seed(100)
library(plyr)  
#create datast
nit <- within(data.frame(x = 3:32),
                 {
                   class <- rep(1:3, each = 10)
                   y <- 0.5 * x* (1:10) + rnorm(30)
                   class <- factor(class)                 # convert to a factor
                 }
                 )
x2<-nit$x*nit$x #for quadratic model
forms<- paste(c("y ~ x", "y ~ x+x2", "log(y) ~ x"), sep = "") # create 3 models
names(forms) <- paste("Model", LETTERS[1:length(forms)])
models <- llply(forms, lm, data = nit)
models                # shows coefficients for each of the 3 models

3 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点,但我喜欢嵌套lapply调用的名称比mapplydo更好(来自包 dplyr )解决方案即使代码看起来有点复杂。这些名称使得模型更容易分开(每个列表元素代表哪个formsclass组合)。

在此解决方案中,将x2实际添加到nit数据集非常重要。

nit$x2 = nit$x*nit$x
models = lapply(forms, 
            function(x) {
                lapply(levels(nit$class), 
                    function(y) {lm(x, data = nit[nit$class == y,])} )
})

输出是一个列表列表,所以我不得不使用unlist recursive = FALSE将其展平为一个列表。

models2 = unlist(models, recursive = FALSE)

现在,您可以轻松地从每个模型的summary中提取所需的元素。例如,以下是您可以为每个模型提供R平方的方法:

lapply(models2, function(x) summary(x)$r.squared)

或者如果你想要一个向量而不是一个列表:

unlist(lapply(models2, function(x) summary(x)$r.squared))

答案 1 :(得分:0)

您可以考虑跳转到线性和二次区分分析,LDA和QDA。 本指南提供了简单的介绍

http://tgmstat.wordpress.com/2014/01/15/computing-and-visualizing-lda-in-r/

答案 2 :(得分:0)

也许是这样的?您可以根据自己的需要调整它。

modsumm <- llply(models, summary)
ldply(modsumm, function(x) data.frame(term = row.names(x$coefficients),
                                      x$coefficients,
                                      R.sq = x$r.squared))

      .id        term     Estimate  Std..Error    t.value     Pr...t..      R.sq
1 Model A (Intercept) -12.60545292 11.37539598 -1.1081331 2.772327e-01 0.5912020
2 Model A           x   3.70767525  0.58265177  6.3634498 6.921738e-07 0.5912020
3 Model B (Intercept)  16.74908684 20.10241672  0.8331877 4.120490e-01 0.6325661
4 Model B           x  -0.73357356  2.60879262 -0.2811927 7.807063e-01 0.6325661
5 Model B          x2   0.12689282  0.07278352  1.7434279 9.263740e-02 0.6325661
6 Model C (Intercept)   1.79394266  0.32323588  5.5499490 6.184167e-06 0.5541830
7 Model C           x   0.09767635  0.01655626  5.8996644 2.398030e-06 0.5541830

或者,如果你只想要F统计量的p值和R平方

 ldply(modsumm, function(x) data.frame(F.p.val = pf(x$fstatistic[1],
                                                    x$fstatistic[2],
                                                    x$fstatistic[3],
                                                    lower.tail = F),
                                       R.sq = x$r.squared))

      .id      F.p.val      R.sq
1 Model A 6.921738e-07 0.5912020
2 Model B 1.348711e-06 0.6325661
3 Model C 2.398030e-06 0.5541830