生成具有特定相关性的数字[仅在输出中显示正值]

时间:2018-03-18 10:25:30

标签: r function correlation

我想获得一个具有模拟值的数据帧,这些模拟值之间具有特定的相关性。

我需要使用这个函数,但是在返回的输出中也有负值,这对我的目的没有意义:

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必须始终为正数)。 我花了很多时间没有任何具体结果......

1 个答案:

答案 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)

然后,您可以缩放生成的矩阵以实现某种标准派生。