View source: R/errorsINseveral.R
errorsINseveral | R Documentation |
Simulates $y-$ and $x-$values for a classical “errors in $x$” linear regression model. One or more $x-$values are subject to random measurement error, independently of the corresponding covariate values that are measured without error.
errorsINseveral(n = 1000, a0 = 2.5, beta = c(1.5, 0), mu = 12.5, SDyerr = 0.5,
default.Vpar = list(SDx = 2, rho = -0.5, timesSDx = 1.5),
V = with(default.Vpar, matrix(c(1, rho, rho, 1), ncol = 2) * SDx^2),
xerrV = with(default.Vpar, matrix(c(1, 0, 0, 0), ncol = 2) * (SDx * timesSDx)^2),
parset = NULL, print.summary = TRUE, plotit = TRUE)
n |
Number of observations |
a0 |
Intercept in linear regression model |
beta |
Regression coefficients. If one coefficient only is given, this will be repeated as many times as necessary |
mu |
Vector of covariate means. |
SDyerr |
SD of $y$, conditional on the covariates measured without error |
default.Vpar |
Parameters for the default model with two explanatory variables, |
V |
Variance-covariance matrix for the z's, measured without error. (These are generated from a multivariate normal distribution, mainly as a matter of convenience) |
xerrV |
Variance-covariance matrix for the added “errors in x” |
parset |
Parameter list (theme) in a form suitable for supplying to
|
print.summary |
If |
plotit |
If |
With default arguments, simulates a model in which two covariates are in contention, the first measured without error, and the second with coefficient 0 in the model that includes both covariates measured without error.
ERRfree |
Data frame holding covariates without error, plus $y$ |
addedERR |
Data frame holding covariates with error, plus $y$ |
John Maindonald
Data Analysis and Graphics Using R, 3rd edn, Section 6.8.1
errorsINx
library(lattice)
function(n=1000, a0=2.5, beta=c(1.5,0), mu=12.5, SDyerr=0.5,
default.Vpar=list(SDx=2, rho=-0.5, timesSDx=1.5),
V=with(default.Vpar, matrix(c(1,rho,rho,1), ncol=2)*SDx^2),
xerrV=with(default.Vpar, matrix(c(1,0,0,0), ncol=2)*(SDx*timesSDx)^2),
parset=NULL, print.summary=TRUE, plotit=TRUE){
m <- dim(V)[1]
if(length(mu)==1)mu <- rep(mu,m)
ow <- options(warn=-1)
xxmat <- sweep(matrix(rnorm(m*n, 0, 1), ncol=m) %*% chol(V), 2, mu, "+")
errxx <- matrix(rnorm(m*n, 0, 1), ncol=m) %*% chol(xerrV, pivot=TRUE)
options(ow)
dimnames(xxmat)[[2]] <- paste("z", 1:m, sep="")
xxWITHerr <- xxmat+errxx
xxWITHerr <- data.frame(xxWITHerr)
names(xxWITHerr) <- paste("xWITHerr", 1:m, sep="")
xxWITHerr[, "y"] <- a0 + xxmat %*% matrix(beta,ncol=1) + rnorm(n, sd=SDyerr)
err.lm <- lm(y ~ ., data=xxWITHerr)
xx <- data.frame(xxmat)
names(xx) <- paste("z", 1:m, sep="")
xx$y <- xxWITHerr$y
xx.lm <- lm(y ~ ., data=xx)
B <- coef(err.lm)
b <- coef(xx.lm)
SE <- summary(err.lm)$coef[,2]
se <- summary(xx.lm)$coef[,2]
if(print.summary){
beta0 <- c(mean(xx$y)-sum(beta*apply(xx[,1:m],2,mean)), beta)
tab <- rbind(beta0, b, B)
dimnames(tab) <- list(c("Values for simulation",
"Estimates: no error in x1",
"LS Estimates: error in x1"),
c("Intercept", paste("b", 1:m, sep="")))
tabSE <- rbind(rep(NA,m+1),se,SE)
rownames(tabSE) <- rownames(tab)
colnames(tabSE) <- c("SE(Int)", paste("SE(", colnames(tab)[-1],")", sep=""))
tab <- cbind(tab,tabSE)
print(round(tab,3))
}
if(m==2 & print.summary){
tau <- default.Vpar$timesSDx
s1 <- sqrt(V[1,1])
s2 <- sqrt(V[2,2])
rho <- default.Vpar$rho
s12 <- s1*sqrt(1-rho^2)
lambda <- (1-rho^2)/(1-rho^2+tau^2)
gam12 <- rho*sqrt(V[1,1]/V[2,2])
expB2 <- beta[2]+beta[1]*(1-lambda)*gam12
print(c("Theoretical attenuation of b1" = lambda, "Theoretical b2" = expB2))
}
if(is.null(parset))parset <- simpleTheme(col=c("gray40","gray40"),
col.line=c("black","black"))
if(plotit){
library(lattice)
zhat <- fitted(xx.lm)
xhat <- fitted(err.lm)
plt <- xyplot(xhat ~ zhat, aspect=1, scales=list(tck=0.5),
panel=function(x,y,...){
panel.xyplot(x,y,type="p",...)
panel.abline(lm(y ~ x), lty=2)
panel.abline(0,1)
},
xlab="Fitted values; regress on exact z",
ylab="Fitted values; regress on x = xWITHerr",
key=list(space="top", columns=2,
text=list(lab=c("Line y=x", "Regression fit to points")),
lines=list(lty=1:2)),
par.settings=parset
)
print(plt)}
invisible(list(ERRfree=xx, addedERR=xxWITHerr))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.