将函数作为文本读取并用于绘图
Read functions as text and use for plotting
我在 .csv 文件的单列中列出了一组 500 个方程。方程式写成这样的文本(例如):
15+6.2*A-4.3*B+3.7*C-7.9*B*C+2*D^2
(这是等式的“右边”,等于“y”,但文本“y=”没有出现在 .csv 文件中)
这些是由其他人写入 .csv 文件的一般线性模型。并非所有模型都具有相同数量的变量。
我想将这些函数读入 R 并以一种允许使用它们(迭代地)制作一个范围内“y”的简单线图(每个 n = 500 个模型一个)的方式格式化它们A 的值(显示在 x 轴上),给定 B、C 和 D 的值。
有人对如何执行此操作有任何建议吗?
我基于这个 [post][1] 想到了一些方法,这不是最好的解决方案,但似乎可行。
方程式
为示例创建了两个等式
models <- c("15+6.2*A-4.3*B+3.7*C-7.9*B*C+2*D^2","50+6.2*A-4.3*B+3.7*C-7.9*B*C+2*D^2")
models_names <- c("model1","model2")
数据
以随机数据为例
data <-
tibble(
A = rnorm(100),
B = rnorm(100),
C = rnorm(100),
D = rnorm(100)
)
函数
然后创建了一个使用这些文本方程式的函数,并将其作为返回值的函数应用
text_model <- function(formula){
eval(parse(text = paste('f <- function(A,B,C,D) { return(' , formula , ')}', sep='')))
out <- f(data$A,data$B,data$C,data$D)
return(out)
}
应用方程
最后,我对数据应用每个方程,绑定两者。
data %>%
bind_cols(
map(.x = models,.f = text_model) %>%
set_names(models_names) %>%
bind_rows(.id = "model")
)
# A tibble: 100 x 6
A B C D model1 model2
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -0.0633 1.18 -0.409 2.01 9.52 54.9
2 -0.00207 1.35 1.28 1.59 9.16 40.3
3 0.798 -0.141 1.58 -0.123 20.6 63.2
4 -0.162 -0.0795 0.408 0.663 14.3 52.0
5 -1.11 0.788 -1.37 1.20 4.71 46.0
6 2.80 1.84 -0.850 0.161 24.4 68.7
7 1.03 0.550 0.907 -1.92 19.0 60.8
8 0.515 -0.179 -0.980 0.0437 19.0 48.9
9 -0.353 0.0643 1.39 1.30 12.5 55.3
10 -0.427 -1.01 -1.11 -0.547 16.7 39.3
# ... with 90 more rows
我在 .csv 文件的单列中列出了一组 500 个方程。方程式写成这样的文本(例如):
15+6.2*A-4.3*B+3.7*C-7.9*B*C+2*D^2
(这是等式的“右边”,等于“y”,但文本“y=”没有出现在 .csv 文件中)
这些是由其他人写入 .csv 文件的一般线性模型。并非所有模型都具有相同数量的变量。
我想将这些函数读入 R 并以一种允许使用它们(迭代地)制作一个范围内“y”的简单线图(每个 n = 500 个模型一个)的方式格式化它们A 的值(显示在 x 轴上),给定 B、C 和 D 的值。
有人对如何执行此操作有任何建议吗?
我基于这个 [post][1] 想到了一些方法,这不是最好的解决方案,但似乎可行。
方程式
为示例创建了两个等式
models <- c("15+6.2*A-4.3*B+3.7*C-7.9*B*C+2*D^2","50+6.2*A-4.3*B+3.7*C-7.9*B*C+2*D^2")
models_names <- c("model1","model2")
数据
以随机数据为例
data <-
tibble(
A = rnorm(100),
B = rnorm(100),
C = rnorm(100),
D = rnorm(100)
)
函数
然后创建了一个使用这些文本方程式的函数,并将其作为返回值的函数应用
text_model <- function(formula){
eval(parse(text = paste('f <- function(A,B,C,D) { return(' , formula , ')}', sep='')))
out <- f(data$A,data$B,data$C,data$D)
return(out)
}
应用方程
最后,我对数据应用每个方程,绑定两者。
data %>%
bind_cols(
map(.x = models,.f = text_model) %>%
set_names(models_names) %>%
bind_rows(.id = "model")
)
# A tibble: 100 x 6
A B C D model1 model2
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -0.0633 1.18 -0.409 2.01 9.52 54.9
2 -0.00207 1.35 1.28 1.59 9.16 40.3
3 0.798 -0.141 1.58 -0.123 20.6 63.2
4 -0.162 -0.0795 0.408 0.663 14.3 52.0
5 -1.11 0.788 -1.37 1.20 4.71 46.0
6 2.80 1.84 -0.850 0.161 24.4 68.7
7 1.03 0.550 0.907 -1.92 19.0 60.8
8 0.515 -0.179 -0.980 0.0437 19.0 48.9
9 -0.353 0.0643 1.39 1.30 12.5 55.3
10 -0.427 -1.01 -1.11 -0.547 16.7 39.3
# ... with 90 more rows