R:在 r 中创建具有特定相关性的数据集
R: Create dataset with specific correlation in r
如何创建一个包含两列的数据集,这些列彼此具有特定的相关性?我希望能够定义将要创建的值的数量并指定输出应具有的相关性。
问题与此类似:Generate numbers with specific correlation
答案之一是使用:
out <- mvrnorm(10, mu = c(0,0), Sigma = matrix(c(1,0.56,0.56,1),, ncol = 2),
mpirical = TRUE)
产生这样的输出:
[,1] [,2]
[1,] -0.4152618 0.033311146
[2,] 0.7617759 -0.181852441
[3,] -1.6393045 -1.054752469
[4,] -1.7872420 -0.605214425
[5,] 0.9581152 2.511000955
[6,] 0.5048160 -0.278329145
[7,] 0.8656220 0.483521747
[8,] -0.1385699 0.017395548
[9,] 0.3261103 -0.932889606
[10,] 0.5639388 0.007808691
具有以下相关性 table cor(out):
[,1] [,2]
[1,] 1.00 0.56
[2,] 0.56 1.00
但我希望数据集包含更高、没有负数和更远的数字 例如:
x y
1 5 5
2 20 20
3 30 30
4 100 100
相关系数为 1:
x y
x 1 1
y 1 1
距离越远,我的意思是 "more" 随机且值更大,就像我上面的示例一样。
有没有(简单的)方法来存档类似的东西?
相关性不受基础变量线性变换的影响。因此,获得所需内容的最直接方法可能是:
out <- as.data.frame(mvrnorm(10, mu = c(0,0),
Sigma = matrix(c(1,0.56,0.56,1),, ncol = 2),
empirical = TRUE))
out$V1.s <- (out$V1 - min(out$V1))*1000+10
out$V2.s <- (out$V2 - min(out$V2))*200+30
现在数据框 out
有 "shifted" 列 V1.s
和 V2.s
,它们是非负的 "large"。您可以在上面的代码中使用任何您想要的数字,而不是 1000、10、200 和 30。相关性的答案仍然是 0.56。
> cor(out$V1.s, out$V2.s)
[1] 0.56
感谢 Curt F。这对我生成一些模拟数据集很有帮助。我添加了一些选项来指定大约。 X 和 Y 所需的平均值和范围。它还提供输出,以便您可以检查斜率和截距以及绘制点和回归线。
library(MASS)
library(ggplot2)
# Desired correlation
d.cor <- 0.5
# Desired mean of X
d.mx <- 8
# Desired range of X
d.rangex <- 4
# Desired mean of Y
d.my <- 5
# Desired range of Y
d.rangey <- 2
# Calculations to create multipliation and addition factors for mean and range of X and Y
mx.factor <- d.rangex/6
addx.factor <- d.mx - (mx.factor*3)
my.factor <- d.rangey/6
addy.factor <- d.my - (my.factor*3)
# Generate data
out <- as.data.frame(mvrnorm(1000, mu = c(0,0),
Sigma = matrix(c(1,d.cor,d.cor,1), ncol = 2),
empirical = TRUE))
# Adjust so that values are positive and include factors to match desired means and ranges
out$V1.s <- (out$V1 - min(out$V1))*mx.factor + addx.factor
out$V2.s <- (out$V2 - min(out$V2))*my.factor + addy.factor
# Create liniear model to calculate intercept and slope
fit <- lm(out$V2.s ~ out$V1.s, data=out)
coef(fit)
# Plot scatterplot along with regression line
ggplot(out, aes(x=V1.s, y=V2.s)) + geom_point() + coord_fixed() + geom_smooth(method='lm')
# Produce summary table
summary(out)
如何创建一个包含两列的数据集,这些列彼此具有特定的相关性?我希望能够定义将要创建的值的数量并指定输出应具有的相关性。
问题与此类似:Generate numbers with specific correlation
答案之一是使用:
out <- mvrnorm(10, mu = c(0,0), Sigma = matrix(c(1,0.56,0.56,1),, ncol = 2),
mpirical = TRUE)
产生这样的输出:
[,1] [,2]
[1,] -0.4152618 0.033311146
[2,] 0.7617759 -0.181852441
[3,] -1.6393045 -1.054752469
[4,] -1.7872420 -0.605214425
[5,] 0.9581152 2.511000955
[6,] 0.5048160 -0.278329145
[7,] 0.8656220 0.483521747
[8,] -0.1385699 0.017395548
[9,] 0.3261103 -0.932889606
[10,] 0.5639388 0.007808691
具有以下相关性 table cor(out):
[,1] [,2]
[1,] 1.00 0.56
[2,] 0.56 1.00
但我希望数据集包含更高、没有负数和更远的数字 例如:
x y
1 5 5
2 20 20
3 30 30
4 100 100
相关系数为 1:
x y
x 1 1
y 1 1
距离越远,我的意思是 "more" 随机且值更大,就像我上面的示例一样。
有没有(简单的)方法来存档类似的东西?
相关性不受基础变量线性变换的影响。因此,获得所需内容的最直接方法可能是:
out <- as.data.frame(mvrnorm(10, mu = c(0,0),
Sigma = matrix(c(1,0.56,0.56,1),, ncol = 2),
empirical = TRUE))
out$V1.s <- (out$V1 - min(out$V1))*1000+10
out$V2.s <- (out$V2 - min(out$V2))*200+30
现在数据框 out
有 "shifted" 列 V1.s
和 V2.s
,它们是非负的 "large"。您可以在上面的代码中使用任何您想要的数字,而不是 1000、10、200 和 30。相关性的答案仍然是 0.56。
> cor(out$V1.s, out$V2.s)
[1] 0.56
感谢 Curt F。这对我生成一些模拟数据集很有帮助。我添加了一些选项来指定大约。 X 和 Y 所需的平均值和范围。它还提供输出,以便您可以检查斜率和截距以及绘制点和回归线。
library(MASS)
library(ggplot2)
# Desired correlation
d.cor <- 0.5
# Desired mean of X
d.mx <- 8
# Desired range of X
d.rangex <- 4
# Desired mean of Y
d.my <- 5
# Desired range of Y
d.rangey <- 2
# Calculations to create multipliation and addition factors for mean and range of X and Y
mx.factor <- d.rangex/6
addx.factor <- d.mx - (mx.factor*3)
my.factor <- d.rangey/6
addy.factor <- d.my - (my.factor*3)
# Generate data
out <- as.data.frame(mvrnorm(1000, mu = c(0,0),
Sigma = matrix(c(1,d.cor,d.cor,1), ncol = 2),
empirical = TRUE))
# Adjust so that values are positive and include factors to match desired means and ranges
out$V1.s <- (out$V1 - min(out$V1))*mx.factor + addx.factor
out$V2.s <- (out$V2 - min(out$V2))*my.factor + addy.factor
# Create liniear model to calculate intercept and slope
fit <- lm(out$V2.s ~ out$V1.s, data=out)
coef(fit)
# Plot scatterplot along with regression line
ggplot(out, aes(x=V1.s, y=V2.s)) + geom_point() + coord_fixed() + geom_smooth(method='lm')
# Produce summary table
summary(out)