1

我想将我在一系列模型中使用的公式添加到 data.frame

require(plyr)
require(nlme)
str(baseball)
ba <- baseball[1:100,]
m01 <- gls( g ~ ab+I(r^2)+cos(pi*h),data=ba,correlation = corARMA(p=1))
m02 <- gls( g ~ I(ab^3)+r+cos(pi*h)+sin(pi*h),data=ba,correlation = corARMA(p=1))
m03 <- gls( g ~ ab+r,data=ba,correlation = corARMA(p=1))

我有 3 个模型,然后我想要两列:模型名称和公式

mof <-ldply(ls(pattern=glob2rx("m0*")))

mof <-ddply(mof, .(V1),transform, form =formula(V1))

这使

Error en as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class '"formula"' into a data.frame

我尝试了很多不同的东西,但无法让它发挥作用。

4

2 回答 2

3

当您使用语言元素时,一些规则会发生变化。您显然想要一两个字符列来标记您的结果,但是您在第一个“mof”对象中构造的是一个字符向量,其中只有模型的名称,而不是模型本身。

> str(mof)
'data.frame':   3 obs. of  1 variable:
 $ V1: chr  "m01" "m02" "m03"

要使用字符向量从工作区检索模型,您需要使用get. 然后,它们将可用于使用功能formula和进行进一步处理as.character。然后您需要在最后“返回”到字符模式,因为类公式的对象不是有效的数据框组件。多合一的嵌套调用将是:

> forms.mat <- sapply( lapply( lapply(mof$V1, get) , formula), as.character)
> forms.mat
     [,1]                        [,2]                                      [,3]    
[1,] "~"                         "~"                                       "~"     
[2,] "g"                         "g"                                       "g"     
[3,] "ab + I(r^2) + cos(pi * h)" "I(ab^3) + r + cos(pi * h) + sin(pi * h)" "ab + r"

您可以重新排列(以使波浪号重新回到 LHS 和 RHS 表达式之间并粘贴在一起(使用 collapse=""):

> apply(forms.mat[ c(2,1,3),], 2, paste, collapse="")
[1] "g~ab + I(r^2) + cos(pi * h)"               "g~I(ab^3) + r + cos(pi * h) + sin(pi * h)"
[3] "g~ab + r"   

您可能通过使用列表来简化这一点:

> mof2 <- list(m01,m02,m03)  # Skipping the search of the workspace and reconstitution 
> lapply(mof2, formula)
[[1]]
g ~ ab + I(r^2) + cos(pi * h)
<environment: 0x2ef997c60>

[[2]]
g ~ I(ab^3) + r + cos(pi * h) + sin(pi * h)
<environment: 0x19fef52d0>

[[3]]
g ~ ab + r
<environment: 0x19fef68d8>

> sapply( lapply(mof2, formula), as.character )
     [,1]                        [,2]                                      [,3]    
[1,] "~"                         "~"                                       "~"     
[2,] "g"                         "g"                                       "g"     
[3,] "ab + I(r^2) + cos(pi * h)" "I(ab^3) + r + cos(pi * h) + sin(pi * h)" "ab + r"
于 2012-12-14T21:20:22.567 回答
0

第一列是可以的模型名称,

mof <-ldply(ls(pattern=glob2rx("m0*")))

第二列应该是模型的公式

names(mof)[1] <- "model"
mof$formula <- as.character(lapply(mof$model,formula))

并且效果很好,之后我将添加带有更正 AIC 的列和其他用于模型选择的东西,但这很好用。

感谢所有评论者!

于 2012-12-15T15:09:38.877 回答