对数变换所有 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))
我想对 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))