对数变换所有 RHS 项

log-transform all RHS terms

我想对 R 公式中的每个 RHS 变量进行对数变换。

f <- x ~ y
f1 <- update(f, . ~ . + z)
update(f, log(.) ~ log(.))
##  log(x) ~ log(y)
update(f1, log(.) ~ log(.))
##  log(x) ~ log(y + z)

真正想要的是log(x) ~ log(y) + log(z)

也许变换成"character",插入"log",然后再变回"formula":

> f <- x ~ y

> f1 <- update(f, . ~ . + z)

> a <- sapply(all.vars(f1),function(x){sprintf("log(%s)",x)})

> f2 <- as.formula(paste(a[1],paste(a[-1],collapse="+"),sep="~"))
> f
x ~ y
> f1
x ~ y + z
> f2
log(x) ~ log(y) + log(z)
> 

不幸的是,如果 RHS 已经包含一个函数,这将不起作用:

> f1 <- update(f, . ~ . + z + exp(v))

> a <- sapply(all.vars(f1),function(x){sprintf("log(%s)",x)})

> f2 <- as.formula(paste(a[1],paste(a[-1],collapse="+"),sep="~"))
> f1
x ~ y + z + exp(v)
> f2
log(x) ~ log(y) + log(z) + log(v)
> 

但这行得通:

f1 <- update(x ~ y, . ~ . + z + exp(v))
a <- strsplit(as.character(f1),"\+|~")
b <- sapply(a,function(x){sprintf("log(%s)",x)})
f2 <- as.formula(paste(b[1],paste(b[-1],collapse="+"),sep="~"))
##  log(x) ~ log(y) + log(z) + log(exp(v))