在R中对联立方程组的参数值进行重采样时,如何存储循环的输出?
我有一个计算4个联立方程参数值的代码。我特别感兴趣的是当a+b(存储在results$ab中)大于3000时存储所有参数组合。如果大于3000,则编码为“是”。我想写一个for循环,它将循环代码以检查a+b>3000并存储相应的值。然后,我希望程序循环1000次,并存储相应“Yes”的参数值。我正在尝试存储输出,但它不会产生任何结果在R中对联立方程组的参数值进行重采样时,如何存储循环的输出?,r,loops,for-loop,differential-equations,data.table,R,Loops,For Loop,Differential Equations,Data.table,我有一个计算4个联立方程参数值的代码。我特别感兴趣的是当a+b(存储在results$ab中)大于3000时存储所有参数组合。如果大于3000,则编码为“是”。我想写一个for循环,它将循环代码以检查a+b>3000并存储相应的值。然后,我希望程序循环1000次,并存储相应“Yes”的参数值。我正在尝试存储输出,但它不会产生任何结果 x <- seq(from = 0.0001, to = 1000, by = 0.1) t <- seq(from = 0.0001, to = 10
x <- seq(from = 0.0001, to = 1000, by = 0.1)
t <- seq(from = 0.0001, to = 1000, by = 0.1)
v <- seq(from = 0.0001, to = 1000, by = 0.1)
w <- seq(from = 0.0001, to = 1000, by = 0.1)
n <- seq(from = 0.0001, to = 1000, by = 0.1)
f <- seq(from = 0.0001, to = 1000, by = 0.1)
values <- list(x = x, t = t, v = v, w = w, n = n, f = f)
for(i in 1:1000){
eqs <- list(
a = expression(x * t - 2 * x),
b = expression(v - x^2),
c = expression(x - w*t - t*t),
d = expression((n - f)/t)
)
for(i in 1:1000){
samples <- 10000
values.sampled <- lapply(values, sample, samples)
results[i] <- sapply(eqs, eval, envir = values.sampled)
results[i] <- data.frame(results)
results$ab[i] <- results$a[i] + results$b[i]
results$binary[i] <- ifelse(results$ab[i] > 3000, "Yes","No")
output[i] <- results[results$binary=="Yes",]
}
what <- as.list(output)
x这里有一个依靠蛮力的解决方案-对x
和t
的所有组合以及x
和v
的组合进行评估:
library(data.table)
# create data
dt <- as.data.table(replicate(6, seq(from = 0.001, to = 1000, by = 1), simplify = F))
names(dt) <- c('x', 't','v','w','n','f')
# if your data.frame has all the combinations you want:
dt[, lapply(eqs, eval, envir = .SD)][, a_b := a + b][]
# This does all of the combinations for eqs a and b - takes 22 seconds for 10,000 rows
dt[, {x_t = CJ(x,t)
x_v = CJ(x,v)
a_b = eval(eqs$a, envir = x_t) + eval(eqs$b, envir = x_v)
output = a_b > 3000L
list(x = x_t[[1]], t = x_t[[2]], v = x_v[[2]], ab = a_b, output = output)
}
][output == T,]
x t v ab output
1: 3.001 754.001 754.001 3001.750 TRUE
2: 3.001 755.001 755.001 3005.751 TRUE
3: 3.001 756.001 756.001 3009.752 TRUE
4: 3.001 757.001 757.001 3013.753 TRUE
5: 3.001 758.001 758.001 3017.754 TRUE
---
479045: 992.001 998.001 998.001 4966.005 TRUE
479046: 992.001 999.001 999.001 5959.006 TRUE
479047: 993.001 998.001 998.001 3977.004 TRUE
479048: 993.001 999.001 999.001 4971.005 TRUE
479049: 994.001 999.001 999.001 3981.004 TRUE
库(data.table)
#创建数据
dta+b
等于(x*t-2*x)+(v-x^2)
,它只是x
中的一个二次方,所以你可以解析地解a+b>3000
,v
和t
不等式是x^2+(2-t)x+(3000-v)<0
替换T=2-T
和V=3000-V
,然后x^2+Tx+V<0
对于任何小于零的值,它必须有两个实根,这意味着
T^2-4V>0
-即V<(T^2)/4
。()
给定满足该不等式的T
和V
,其中a+b>3000
的x的值是二次方的根之间的值,即|2x+T |
因此,如果您希望选择满足条件的值,则可以直接在t
的值范围内循环,选择满足v<(t^2)/4
的v
,然后选择适当范围内的x
这里有一个方法
t <- 1:1000
T <- 2 - t
V <- sapply((T ^ 2) / 4, function(z) runif(min = 0, max = z, n = 1)) #assumes V>0 (???)
v <- 3000 - V
x <- (sapply(sqrt(T ^ 2 - 4 * V), function(z) runif(min = -z, max = z, n = 1)) - T) / 2
ab <- (x * t - 2 * x) + (v - x ^ 2) #all >3000 (except for t=2, where ab=3000 exactly)
t根据您的描述,这里有一个tidyverse解决方案:
库(tidyverse)
n每项试验的样本数%head(2)%>%scape()
#>2人名单
#>$:类“tbl_df”、“tbl”和“data.frame”:4840 obs。在12个变量中:
#>..$x:num[1:4840]720.722.944.720.710.6。。。
#>..$t:num[1:4840]794325768400531。。。
#>..$v:num[1:4840]172 962 853 901 264。。。
#>..$w:num[1:4840]842.8274.318.9957.2321.8。。。
#>..$n:num[1:4840]605322671890965。。。
#>..$f:num[1:4840]397557299691825。。。
#>..$a:num[1:4840]57079573973422282455604。。。
#>..$b:num[1:4840]-519236437-1145473152。。。
#>..$c:num[1:4840]-1298899-194750-603673-543387-452411。。。
#>..$d:num[1:4840]0.261-0.7230.486 0.497 0.264。。。
#>..$ab:num[1:4840]51558 7834 33077 8718 5756。。。
#>..$binary:chr[1:4840]“是”“是”“是”“是”。。。
#>$:类“tbl_df”、“tbl”和“data.frame”:4815 obs。在12个变量中:
#>..$x:num[1:4815]400806410 477169。。。
#>..$t:num[1:4815]992938893573257。。。
#>..$v:num[1:4815]453773456279933。。。
#>..$w:num[1:4815]778254 189183784。。。
#>..$n:num[1:4815]629811151529667。。。
#>..$f:num[1:4815]90330995908340。。。
#>..$a:num[1:4815]395543 754765 365563 271843 43214。。。
#>..$b:num[1:4815]-159307-649186-167726-226773-27764。。。
#>..$c:num[1:4815]-1754435-1117341-966696-431818-267523。。。
#>..$d:num[1:4815]-0.2770.513-0.654-0.6621.275。。。
#>..$ab:num[1:4815]2362361055791978374507015450。。。
#>..$binary:chr[1:4815]“是”“是”“是”“是”。。。
由(v0.3.0)于2019年10月19日创建
如果我误解了目标,请告诉我。列表名称中不能使用数组索引符号,因此[I]=表达式(…)不正确。同样对于每个迭代i,x,t,v。。。向量是一样的,为什么要重复1000次呢?你是在尝试采样x,t,v,…,的各种值,计算a,b,c,d,然后计算出这些x,t,…,的哪些组合,。。最终a+b>3000?你能做一个约束优化吗?找到x,t。。。a+b>3000?你说得对。看起来我必须循环采样x,t,v的各种值来计算a,b,c,d,这使得a+b>3000。我不知道如何进行约束优化方法为什么循环有两个?一个真的嵌套在另一个里面吗?无论哪种方式,其中一个都缺少结束括号。results
是何时第一次定义的?我在results[I]上遇到一个错误,你能解释一下CJ[x\t]是什么吗?另外,当我运行这个输出时,我得到了5列的空data.table(0行):x,t,v,ab,output@BiotechgeekCJ()
与expand.grid()
非常相似,因为它是两个向量的笛卡尔积。您的评论是CJ[x_t]
,这只是一个向量。我的代码是x\u t=CJ(x,t)
。