R. 运行 数据框中的优化函数
R. Run optimization function in data frame
我在 R 中有一个数据框 df1,看起来像这样(所有值都是随机选择的,但都是真实数据的近似值):
A B C D E F G H
a 0.04 0.01 50 70 0.01 ... 0.0002
b 0.03 0.1 49 69 0.01 ... 0.0003
c 0.03 0.02 51 71 0.005 ... 0.004
d 0.04 0.02 50 70 0.006 ... 0.0005
G是这样得到的:
# Equation 1:
G = (B - C)^2 - B*(1 - B)/(D- 1) - C*(1 - C)/(E - 1)
library(dplyr)
df2 = df1 %>% mutate(G = (B - C)^2 - B*(1 - B)/(D- 1) - C*(1 - C)/(E - 1))
我想创建一个新列 G1,在每一行中应用优化函数。
G1是用方程1得到的,但是用H代替B。H是用方程2得到的:
# Equation 2:
H = (B - z*F)/(1 - z)
我想创建一个新列 Z,z 的值从 0 到 1(step=0.01),产生最低的 G1。
我希望得到这样的东西:
A B C D E F G H G1 Z
a 0.04 0.01 50 70 0.01 ... 0.0002 ... ...
b 0.03 0.1 49 69 0.01 ... 0.0003 ... ...
c 0.03 0.02 51 71 0.005 ... 0.004 ... ...
d 0.04 0.02 50 70 0.006 ... 0.0005 ... ...
编辑:(澄清)
我的问题是如何在给定 H(以及上述条件)的情况下找到产生最低 G1 的 z 并获得 G1。
添加z
列,进行计算,求每组内的最小值。在问题 中,我们添加了一个虚拟列以加入以进行交叉联接。
df2 %>% mutate(cj = 1) %>%
full_join(data.frame(cj = 1, z = seq(0, 1, by = 0.01)) %>%
select(-cj) %>%
mutate(H = (B - z*F)/(1 - z),
G1 = (H - C)^2 - H*(1 - H)/(D- 1) - C*(1 - C)/(E - 1)) %>%
group_by(A, B, C, D, E, F) %>%
arrange(G1) %>%
slice(1)
考虑通过 G1 函数和数据框提供的所有其他参数循环遍历 0.01 的倍数,从 0.01 到 1。然后取返回值向量的最小值。
具体来说,您可以设置一个函数,使用 mapply
(逐元素迭代器函数)和 returns 的最小值 z[=32 来传递逐行值=]值。
Data (F 改为 F_ 以避免出现 FALSE 问题)
txt <- "A B C D E F_
a 0.04 0.01 50 70 0.01
b 0.03 0.1 49 69 0.01
c 0.03 0.02 51 71 0.005
d 0.04 0.02 50 70 0.006"
df <- read.table(text=txt, header=TRUE)
函数
main <- function(B_param, C_param, D_param, E_param, F_param) {
# EXTENDED G1 FUNCTION (WITH HELPER H)
func <- function(z) {
H <- (B_param - z*F_param)/(1 - z)
G1 <- (H - C_param)^2 - H*(1 - H)/(D_param- 1) - C_param*(1 - C_param)/(E_param - 1)
}
# ITERATE THROUGH 0.01 MULTIPLES
tmp <- sapply(seq(0.01, 0.99, 0.01), func)
# RETURN Z AT THE MINIMUM OF VECTOR OF VALUES
min_z <- seq(0.01, 0.99, 0.01)[which.min(tmp)]
return(min_z)
}
数据框调用 (使用base的within
添加新列)
final_df <- within(df, {
G <- (B - C)^2 - B*(1 - B)/(D- 1) - C*(1 - C)/(E - 1)
# CALCULATE z BY PASSING COLUMN VALUES ELEMENTWISE
z <- mapply(main, B, C, D, E, F_)
H <- (B - z*F_)/(1 - z)
G1 <- (H - C)^2 - H*(1 - H)/(D- 1) - C*(1 - C)/(E - 1)
})
options(scipen=999)
# RE-ORDER COLUMNS
final_df[order(names(final_df))]
# A B C D E F_ G G1 H z
# 1 a 0.04 0.01 50 70 0.010 -0.00002715173 -0.00001456576 0.04030303 0.01
# 2 b 0.03 0.10 49 69 0.010 0.00297022059 -0.00326311275 0.11000000 0.80
# 3 c 0.03 0.02 51 71 0.005 -0.00076200000 -0.00076163193 0.03025253 0.01
# 4 d 0.04 0.02 50 70 0.006 -0.00066773144 -0.00066032187 0.04034343 0.01
我在 R 中有一个数据框 df1,看起来像这样(所有值都是随机选择的,但都是真实数据的近似值):
A B C D E F G H
a 0.04 0.01 50 70 0.01 ... 0.0002
b 0.03 0.1 49 69 0.01 ... 0.0003
c 0.03 0.02 51 71 0.005 ... 0.004
d 0.04 0.02 50 70 0.006 ... 0.0005
G是这样得到的:
# Equation 1:
G = (B - C)^2 - B*(1 - B)/(D- 1) - C*(1 - C)/(E - 1)
library(dplyr)
df2 = df1 %>% mutate(G = (B - C)^2 - B*(1 - B)/(D- 1) - C*(1 - C)/(E - 1))
我想创建一个新列 G1,在每一行中应用优化函数。
G1是用方程1得到的,但是用H代替B。H是用方程2得到的:
# Equation 2:
H = (B - z*F)/(1 - z)
我想创建一个新列 Z,z 的值从 0 到 1(step=0.01),产生最低的 G1。
我希望得到这样的东西:
A B C D E F G H G1 Z
a 0.04 0.01 50 70 0.01 ... 0.0002 ... ...
b 0.03 0.1 49 69 0.01 ... 0.0003 ... ...
c 0.03 0.02 51 71 0.005 ... 0.004 ... ...
d 0.04 0.02 50 70 0.006 ... 0.0005 ... ...
编辑:(澄清)
我的问题是如何在给定 H(以及上述条件)的情况下找到产生最低 G1 的 z 并获得 G1。
添加z
列,进行计算,求每组内的最小值。在问题
df2 %>% mutate(cj = 1) %>%
full_join(data.frame(cj = 1, z = seq(0, 1, by = 0.01)) %>%
select(-cj) %>%
mutate(H = (B - z*F)/(1 - z),
G1 = (H - C)^2 - H*(1 - H)/(D- 1) - C*(1 - C)/(E - 1)) %>%
group_by(A, B, C, D, E, F) %>%
arrange(G1) %>%
slice(1)
考虑通过 G1 函数和数据框提供的所有其他参数循环遍历 0.01 的倍数,从 0.01 到 1。然后取返回值向量的最小值。
具体来说,您可以设置一个函数,使用 mapply
(逐元素迭代器函数)和 returns 的最小值 z[=32 来传递逐行值=]值。
Data (F 改为 F_ 以避免出现 FALSE 问题)
txt <- "A B C D E F_
a 0.04 0.01 50 70 0.01
b 0.03 0.1 49 69 0.01
c 0.03 0.02 51 71 0.005
d 0.04 0.02 50 70 0.006"
df <- read.table(text=txt, header=TRUE)
函数
main <- function(B_param, C_param, D_param, E_param, F_param) {
# EXTENDED G1 FUNCTION (WITH HELPER H)
func <- function(z) {
H <- (B_param - z*F_param)/(1 - z)
G1 <- (H - C_param)^2 - H*(1 - H)/(D_param- 1) - C_param*(1 - C_param)/(E_param - 1)
}
# ITERATE THROUGH 0.01 MULTIPLES
tmp <- sapply(seq(0.01, 0.99, 0.01), func)
# RETURN Z AT THE MINIMUM OF VECTOR OF VALUES
min_z <- seq(0.01, 0.99, 0.01)[which.min(tmp)]
return(min_z)
}
数据框调用 (使用base的within
添加新列)
final_df <- within(df, {
G <- (B - C)^2 - B*(1 - B)/(D- 1) - C*(1 - C)/(E - 1)
# CALCULATE z BY PASSING COLUMN VALUES ELEMENTWISE
z <- mapply(main, B, C, D, E, F_)
H <- (B - z*F_)/(1 - z)
G1 <- (H - C)^2 - H*(1 - H)/(D- 1) - C*(1 - C)/(E - 1)
})
options(scipen=999)
# RE-ORDER COLUMNS
final_df[order(names(final_df))]
# A B C D E F_ G G1 H z
# 1 a 0.04 0.01 50 70 0.010 -0.00002715173 -0.00001456576 0.04030303 0.01
# 2 b 0.03 0.10 49 69 0.010 0.00297022059 -0.00326311275 0.11000000 0.80
# 3 c 0.03 0.02 51 71 0.005 -0.00076200000 -0.00076163193 0.03025253 0.01
# 4 d 0.04 0.02 50 70 0.006 -0.00066773144 -0.00066032187 0.04034343 0.01