2014-09-10 85 views
0

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

我的代码如下所示:

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 
+0

这是R编程的问题,几乎肯定会得到在计算器上更好的反应。 – conjugateprior 2014-09-10 12:51:24

回答

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,])}) 
}) 

输出是列出的名单,虽然如此,我不得不将压扁使用unlistrecursive = 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)) 
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