我试图(有些)优雅地将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
答案 0 :(得分:1)
有多种方法可以做到这一点,但我喜欢嵌套lapply
调用的名称比mapply
或do
更好(来自包 dplyr )解决方案即使代码看起来有点复杂。这些名称使得模型更容易分开(每个列表元素代表哪个forms
和class
组合)。
在此解决方案中,将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