我有一个简单的函数se <- 0.11 * (x^2) - 0.002 * x
。我想生成两个输出变量se.m
和se.st
- 每个变量存储100次迭代的结果,并以特定的时间间隔为x
提供随机重新定义的值:
se.m <- 0.11 * (x^2) - 0.002 * x # if x[0,1]
或
se.st <- 0.11 * (x^2) - 0.002 * x # if x(1,5]
我写了这段代码:
my.mat <- matrix(0,100,2)
x <- runif(n = 1, min = 0, max = 5)
fuchs <- function(n){
x.m <- runif(n = 1, min = 0, max = 1)
x.st <- runif(n = 1, min = 1, max = 5)
for(i in 1:n){
print(x.m[i] <- runif(n = 1, min = 0, max = 1))
se.m <- 0.11 * (x.m^2) - 0.002 * x.m
print(x.st[i] <- runif(n = 1, min = 1, max = 5))
se.st <- 0.11 * (x.st^2) - 0.002 * x.st
}
return(list(se.m, se.st))
}
fuchs(100)
如何将输出存储在两列中?我尝试使用matrix
命令,但是我收到数据太长的错误:
my.mat&lt; -matrix(my.mat,se.m) 矩阵中的错误(my.mat,se.m):数据太长
list命令也不会产生任何输出。
我是R的新手,你可以猜到,并且非常赞赏建设性的评论/批评。
答案 0 :(得分:1)
我不明白你为何循环。您使用的所有功能都是矢量化的。
x.m <- runif(100, 0, 1)
#ensure 1 is not included
repeat {
x.st <- runif(100, 1, 5)
if (!any((x.st - 1) < .Machine$double.eps)) break
}
cbind(0.11 * (x.m^2) - 0.002 * x.m,
0.11 * (x.st^2) - 0.002 * x.st)
最困难的问题是从半开区间采样。这导致floating point imprecision的考虑。因此,您需要在间隔限制附近排除模糊范围。然而,采样下限间隔的概率很低,实际上为零。因此,我不打算处理这个案子。
答案 1 :(得分:0)
1)问题似乎在索引中。
fuchs <- function(n){
x.m=se.m=x.st=se.st=NULL
for(i in 1:n){
print(x.m[i] <- runif(n = 1, min = 0, max = 1))
se.m[i] <- 0.11 * (x.m[i]^2) - 0.002 * x.m[i]
print(x.st[i] <- runif(n = 1, min = 1, max = 5))
se.st[i] <- 0.11 * (x.st[i]^2) - 0.002 * x.st[i]
}
return(list(se.m, se.st))
}
fuchs(100)
在原始代码中,您将单个随机数设置为变量x.m
和x.st
,然后在for
周期中添加其他值。在最后一次迭代中,方程适用于整个向量。请注意,se.m
和se.st
等式是相同的:
se.m&lt; -0.11 *(x ^ 2) - 0.002 * x
se.st&lt; -0.11 *(x ^ 2) - 0.002 * x
2)要在矩阵中输出结果,请使用jogo注释中提供的代码,或使用data.frame
。为了更好地解决代码问题,我建议您还返回相应的x
值。
return(data.frame(x.m = x.m, se.m = se.m, x.st = x.st, se.st = se.st))
3)runif
函数从均匀分布中生成一个数字,而不是极值。功能帮助中的文字:
runif
不会生成任何一个极值,除非max = min
或max-min
与min
相比较小,特别是对于默认参数。