В приведенном ниже коде я сначала создаю 10 различных средств классов, а затем использую средства для получения случайных значений из этих средств. Код идентичен для двух сценариев, но вам нужно будет отрегулировать дисперсию внутри и между классами, чтобы получить желаемые результаты.
Сценарий 1:
Здесь вы хотите создать 10 классов с различными средствами (я предполагаю, что средства следуют двумерное гауссово распределение). Разница между классами намного меньше, чем разница между классами.
library(MASS)
n <- 20
# subjects per class
classes <- 10
# number of classes
mean <- 100
# mean value for all classes
var.between <- 25
# variation between classes
var.within <- 225
# variation within classes
covmatrix1 <- matrix(c(var.between,0,0,var.between), nrow=2)
# covariance matrix for the classes
means <- mvrnorm(classes, c(100,100), Sigma=covmatrix1)
# creates the means for the two variables for each class using variance between classes
covmatrix2 <- matrix(c(var.within,0,0,var.within), nrow=2)
# creates a covariance matrix for the subjects
class <- NULL
values <- NULL
for (i in 1:10) {
temp <- mvrnorm(n, c(means[i], means[i+classes]), Sigma=covmatrix2)
class <- c(class, rep(i, n))
values <- c(values, temp)
}
# this loop uses generates data for each class based on the class means and variance within classes
valuematrix <- matrix(values, nrow=(n*classes))
data <- data.frame (class, valuematrix)
plot(data$X1, data$X2)
В качестве альтернативы, если вы не заботитесь о задании дисперсии между классами, и вы не хотите какой-либо корреляции внутри классов, вы можете просто сделать это:
covmatrix <- matrix(c(225, 0, 0, 225), nrow=2)
# specifies that the variance in both groups is 225 and no covariance
values <- matrix(mvrnorm(200, c(100,100), Sigma=covmatrix), nrow=200)
# creates a matrix of 200 individuals with two values each.
Сценарий 2:
Здесь единственное отличие состоит в том, что разница между классами больше, чем вариация внутри классов. Попробуйте обмениваясь значение переменной var.between примерно до 500, а переменная var.within до 25, и вы увидите четкую кластеризацию рассеивания:
n <- 20
# subjects per class
classes <- 10
# number of classes
mean <- 100
# mean value for all classes
var.between <- 500
# variation between classes
var.within <- 25
# variation within classes
covmatrix1 <- matrix(c(var.between,0,0,var.between), nrow=2)
# covariance matrix for the classes
means <- mvrnorm(classes, c(100,100), Sigma=covmatrix1)
# creates the means for the two variables for each class using variance between classes
covmatrix2 <- matrix(c(var.within,0,0,var.within), nrow=2)
# creates a covariance matrix for the subjects
class <- NULL
values <- NULL
for (i in 1:10) {
temp <- mvrnorm(n, c(means[i], means[i+classes]), Sigma=covmatrix2)
class <- c(class, rep(i, n))
values <- c(values, temp)
}
# this loop uses generates data for each class based on the class means and variance within classes
valuematrix <- matrix(values, nrow=(n*classes))
data <- data.frame (class, valuematrix)
plot(data$X1, data$X2)
Участок должен подтвердить, что данные сгруппированы.
Надеюсь, это поможет!
Хотя этот вопрос имеет статистический компонент, было бы интересно объяснить различие между два сценария - его акцент на «R» заставил его собирать чисто программно-ориентированные ответы, делая его вне темы на CV. – whuber
Я действительно хочу, чтобы иметь возможность воспроизвести 2 сценария, чтобы лучше понять различия и как они применяются к линейным моделям. – Sofia