我试试
我的代码是:
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])
}
我预计估计应该是好的。但是
test(300,301)
的结果与我预期的一样好,实际参数和估计的散点图散布在身份线y = x周围。 test(300,300)
的结果非常糟糕。test(300,300)
,为什么结果是坏的?我错了什么?顺便说一句,我的操作系统是Windows 7,R是3.1.0。
答案 0 :(得分:0)
您的模型在m!=n
时返回完全不同的内容的原因是因为rmvlogis
函数在z.vals
和z.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))
正如预期的那样,响应会根据latent
分布的平均值向上或向下推。也许您打算将mean
设置为零?