如何在包ltm中使用rmvlogis来模拟rasch模型数据?

时间:2014-05-17 01:08:37

标签: r

我试试

  1. 使用rmvlogis(在包ltm中)用40个rasch项目和n个考生来模拟数据
  2. 使用上面的数据和rasch(在包ltm中),修复已知的前14项参数,估算剩余26项的参数。
  3. 我的代码是:

    library(ltm)
    test<-function(n,m) {
      # for reproducible
      set.seed(12345)
      # generate 40 rasch item parameters
      b<-rbeta(40,1.2,1.5)*4-2
      # generate abilities of n examinees
      latents<-rnorm(n,1.5,1.5)
      # construct thetas for rmvlogis, rasch model with discrimination =1
      thetas<-cbind(b,1)
      # generate response data of m examinees with latents
      data<-rmvlogis(m,thetas=thetas,z.vals=latents,IRT=FALSE,link="logit")
      # estimate parameters of items 15-40, use items 1-10 as anchor
      model<-rasch(data=data,constraint=cbind(c(1:14,41),c(b[1:14],1)),IRT=FALSE,start="random")
      # compare b and model$coef[,1]
      plot(b[1:14],model$coef[1:14,1],xlab="b",ylab="bhat")
      abline(a=0,b=1)
      points(b[15:40],model$coef[15:40,1])
    }
    

    我预计估计应该是好的。但是

    1. 执行test(300,301)的结果与我预期的一样好,实际参数和估计的散点图散布在身份线y = x周围。
    2. 我认为执行test(300,300)的结果非常糟糕。
    3. 根据关于ltm中的rmvlogis的文档,我想我应该使用test(300,300),为什么结果是坏的?我错了什么?
    4. 顺便说一句,我的操作系统是Windows 7,R是3.1.0。

1 个答案:

答案 0 :(得分:0)

您的模型在m!=n时返回完全不同的内容的原因是因为rmvlogis函数在z.valsz.vals的长度时忽略n你打电话给m)是不平等的。查看函数rmvlogis,你会看到这一行:

z <- if (is.null(z.vals) || length(z.vals) != n) {
    switch(distr, 
         normal = rnorm(n), # Your case.
         logistic = sqrt(3)/pi * 
         rlogis(n), `log-normal` = (rlnorm(n) - exp(0.5))/sqrt(exp(2) - 
         exp(1)), uniform = runif(n, -3.5, 3.5)/sqrt(7^2/12))
}

因此,如果m!=n(在您的函数中)这将导致length(z.vals) != n,那么您的z.vals参数将被完全忽略,并被正态分布取代,平均值为0标准差为1.

所以,你的&#34;好&#34;只有当您的某个参数被忽略时才会发生结果。但是,我的问题是,当你将latents的正态分布的平均值设置为1.5时,为什么你会期望所有点落在线上?如果将它们设置为零,则会得到此结果。下面,我稍微修改你的函数,为受约束和不受约束的点着色,这样你就可以手动设置绘制潜伏点的正态分布的平均值:

# Modified function
test<-function(n,m,latent.mean) {
  set.seed(12345)
  b<-rbeta(40,1.2,1.5)*4-2
  latents<-rnorm(n,latent.mean,1.5)
  thetas<-cbind(b,1)
  data<-rmvlogis(m,thetas=thetas,z.vals=latents,IRT=FALSE,link="logit")
  model<-rasch(data=data,constraint=cbind(c(1:14,41),c(b[1:14],1)),IRT=FALSE,start="random")
  plot(b[1:14],model$coef[1:14,1],xlab="b",ylab="bhat", col='blue',main=paste('Latent mean:',latent.mean))
  abline(a=0,b=1)
  points(b[15:40],model$coef[15:40,1],col='red')
}

# PLot the three
par(mfrow=c(1,3))
test(300,300,latent.mean=1)
test(300,300,latent.mean=0)
test(300,300,latent.mean=-1)
par(mfrow=c(1,1))

enter image description here

正如预期的那样,响应会根据latent分布的平均值向上或向下推。也许您打算将mean设置为零?