2014-09-10 42 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