我想获得一个具有模拟值的数据帧,这些模拟值之间具有特定的相关性。
我需要使用这个函数,但是在返回的输出中也有负值,这对我的目的没有意义:
COR <- function (n, xmean, xsd, ymean, ysd, correlation) {
x <- rnorm(n)
y <- rnorm(n)
z <- correlation * scale(x)[,1] + sqrt(1 - correlation^2) *
scale(resid(lm(y ~ x)))[,1]
xresult <- xmean + xsd * scale(x)[,1]
yresult <- ymean + ysd * z
data.frame(x=xresult,y=yresult)
}
请注意,我的问题从上一篇文章(目前已关闭)开始: another similar discussion
是否有一种方法能够从最终输出中排除至少有一个负值的所有行? (换句话说,x和y必须始终为正数)。 我花了很多时间没有任何具体结果......
答案 0 :(得分:0)
使用apply
函数可以对具有至少一个负值的行进行过滤,例如
df <- simcor(100, 1, 1, 1, 1, 0.8)
filter <- apply(df, 1, function(x) sum(x < 0) > 0)
df <- df[!filter,]
plot(df)
首先,我从你的功能创建一个数据帧df
。然后,我将函数sum(x < 0) > 0
逐行应用于数据帧(apply的第二个参数,1
表示沿着数据帧或数组的第一个维度)。这将为每行至少有一个负值创建一个TRUE
的逻辑向量。使用与(!filter
)相反的方法对数据框进行子集,可以为您提供没有负值的所有行。
<强>更新强>:
似乎包VineCopula
提供了创建具有给定相关性的分布的函数。但是,我没有深入研究数学,所以我无法完全掌握copulas(即多变量概率分布)是如何工作的。使用此软件包,您至少可以创建例如两个高斯分布。
library(VineCopula)
BC <- BiCop(family = 1, par = 0.9)
sim <- BiCopSim(N = 1000, obj = BC)
cor(sim[,1], sim[,2])
plot(sim)
然后,您可以缩放生成的矩阵以实现某种标准派生。