如何在 R 中模拟李克特规模数据?

机器算法验证 r 分类数据 模拟 多项分布 李克特
2022-03-24 22:31:37

我想做一个蒙特卡洛实验来检查我关于李克特规模数据的理论发现。

我希望有 N 个参与者的随机测试结果,其中每个问题都有 5 个答案:(0、1、2、3 和 4),给定概率(0.1、0.2、0.4、0.2、0.1)

4个回答

李克特量表,正如该术语通常使用的那样,只是一个有序的评级量表该短语通常用于单个评级,可能被称为likert item传统上,想法是您将拥有一组所有测量相同事物并具有相同测量属性的李克特项目。结果是您可以对这些项目进行求和(或平均),并最终得到一个很好的测量值,该测量值近似于连续的间隔尺度(参见:测量水平)。

另一方面,要模拟数据,您需要知道数据应该具有的分布。更一般地说,对于模拟研究,人们通常希望对结果分布有一个数据生成过程李克特量表是一种数据收集工具,不是分布,也不是数据生成过程。

因此,您最终需要的是指定一个您认为适合您想要模拟的最终李克特数据的数据生成过程。之后,只有特定于您打算使用的软件(在您的情况下为 R)的琐碎实现细节。因为人们将李克特数据概念化为从潜在变量派生的明显数据,所以最常见的方法是根据理论化分布(可能是正态分布)模拟潜在变量,然后有一个函数将其映射到一个小的有序集合数字(例如,1,,5)。请注意,从潜在变量转移到清单变量会使潜在变量分布的许多参数无法识别,因此您通常不必担心它们。一种简单的方法是只将这两个步骤直接移动到最终评级,但更全面的方法可以使用他们自己的两个步骤集对每个项目进行建模,然后将李克特量表从项目中组合起来,就像他们将在一个真实的案例中。


这是一个用 R 编码的示例。我会想象有 5 个项目测量相同的结构。因此,它们是适度相关的。两个项目可能是“反向评分”,但我会假设这不会明显影响结果,所以我不会模拟。但是,我会让一些与基础变量的相关性比其他变量更强烈,并且我会让一些偏向于更高或更低的评级。

set.seed(8649)     # this makes the example exactly reproducible
N      = 10        # this is how much data I'll generate
latent = rnorm(N)  # this is the actual latent variable I want to be measureing

##### generate latent responses to items
item1 = latent + rnorm(N, mean=0, sd=0.2)  # the strongest correlate
item2 = latent + rnorm(N, mean=0, sd=0.3)
item3 = latent + rnorm(N, mean=0, sd=0.5)
item4 = latent + rnorm(N, mean=0, sd=1.0)
item5 = latent + rnorm(N, mean=0, sd=1.2)  # the weakest

##### convert latent responses to ordered categories
item1 = findInterval(item1, vec=c(-Inf,-2.5,-1, 1,2.5,Inf))  # fairly unbiased
item2 = findInterval(item2, vec=c(-Inf,-2.5,-1, 1,2.5,Inf))
item3 = findInterval(item3, vec=c(-Inf,-3,  -2, 2,3,  Inf))  # middle values typical
item4 = findInterval(item4, vec=c(-Inf,-3,  -2, 2,3,  Inf))
item5 = findInterval(item5, vec=c(-Inf,-3.5,-3,-1,0.5,Inf))  # high ratings typical

##### combined into final scale
manifest = round(rowMeans(cbind(item1, item2, item3, item4, item5)), 1)
manifest
# [1]  3.4  3.6  3.4  3.8  2.6  3.4  3.2  2.0  3.8  3.2
round(latent, 1)
# [1]  1.3  0.6  0.2  1.0 -1.5  0.1  0.4 -2.5  2.3 -0.3
cor(manifest, latent)
# [1] 0.9280074

要执行模拟,这里是使用示例函数的单行解决方案:

sample(0:4, N, replace = TRUE, prob = c(0.1, 0.2, 0.4, 0.2, 0.1))

#where:
# 0:4 is the sequence of values (0 to 4 in this case)
# N is the number of samples (participants)
# replace = TRUE for sampling with replacement 
# prob = c(0.1, 0.2, 0.4, 0.2, 0.1) is the probability of selection for each score.

生成李克特数据的一种方法是根据比例优势模型。在这里,(潜在)响应的潜在分布是一个逻辑随机变量,其中心可以作为一个或多个预测变量的函数而变化。然后将潜在变量阈值化为具有任意数量切点的多个类别。达到目标数量的响应类别非常困难,要么需要高级数学,要么(更有可能)靠耳朵来玩。μ

set.seed(123)
n <- 1e6
beta <- 0.3
alpha <- sort(rnorm(5))
x <- seq(-3, 3, length.out = n)
z <- rlogis(n, beta*x)
y <- factor(findInterval(z, alpha))
library(MASS)
fit <- polr(formula = y ~ x)

生成关联:

> coef(fit)
        x 
0.2982142 

的两组X

原始来源在这里:http ://ravshansk.com/articles/likert.html

以下公式不仅适用于李克特尺度模型,也适用于任何分类分布的变量。

假设您要为 N 个参与者生成一个 5 类数据(x1、x2、x3、x4、x5),概率为(1/10、2/10、4/10、2/10、1/10)。以下公式将起作用:

distribution <- c(rep(x1,1),rep(x2,2),rep(x3,4),rep(x4,2),rep(x5,1))
potential_population <- rep(distribution, M) #M is any number greatN
likert_data <- sample(potential_population, N)

这里的主要思想是编写一个具有适当重复次数的列表“分布”,这些重复次数将共同满足所需的概率。不用说,您必须为概率设置公分母整数分子