我在从R。
中提取一些模型摘要统计信息时遇到了一些麻烦例如,让我们使用iris
数据集。
data(iris)
model1 <- summary(lm(Sepal.Length~Sepal.Width,data=iris))
我想从摘要统计信息中提取r.squared
和adj.r.squared
。
lapply(model1, "[", c("r.squared", "adj.r.squared"))
Error in terms.formula(newformula, specials = names(attr(termobj, "specials"))) :
invalid model formula in ExtractVars
我很困惑,因为以下似乎工作正常:
model1[c('r.squared', 'adj.r.squared')]
# $r.squared
# [1] 0.01382265
#
# $adj.r.squared
# [1] 0.007159294
有人理解这个错误吗?非常感谢您提供的任何帮助。
答案 0 :(得分:3)
此处不需要lapply
。 str(model1)
告诉我们model1
是包含
> names(model1)
# [1] "call" "terms" "residuals" "coefficients"
# [5] "aliased" "sigma" "df" "r.squared"
# [9] "adj.r.squared" "fstatistic" "cov.unscaled"
可以使用c(model1)
查看整个列表。可以使用
> model1[c('r.squared', 'adj.r.squared')]
# $r.squared
# [1] 0.01382265
# $adj.r.squared
# [1] 0.007159294
或使用正则表达式捕获两个r平方值
> model1[grepl('squared', names(model1))]
# $r.squared
# [1] 0.01382265
# $adj.r.squared
# [1] 0.007159294
答案 1 :(得分:0)
@RichardScriven的替代方案,如果你真的想使用lapply
(也许是因为这是类似测试的推广):你已经交换了参数。
您正尝试从一次运行中迭代模型统计信息列表并获取两个元素。例如,如果:
a <- list(x=1, y=2, z=3)
然后lapply(a,
[, c('x', 'y'))
将首先展开到a[1][ c('x', 'y') ]
然后a[2][ c('x', 'y') ]
,最后展开a[3][ c('x', 'y') ]
,而不是(我认为)你想要的。 1
你可以选择两种方式。
尝试lapply( c('x', 'y'), function(i) a[[i]])
(或sapply
,就此而言)。不过,这可能有点尴尬,因为它首先没有优于a[ c('x', 'y') ]
的优势。
如果您打算从多次运行中获取模型统计信息,并且只是尝试使用一组统计信息,请尝试:
lapply(list(a),`[`,c('x','y'))
将list(a)
替换为可能由modellist
形成的modellist <- list(model1, model2, model3)
(或更合适地,返回不同的*apply
函数。
PS:
1 如果你尝试它,它不会完全 - 输出不匹配 - 但概念上我是如何设想正在发生的事情。< / p>