在R中创建模拟数据多元回归

时间:2014-11-24 21:24:40

标签: r regression simulate

我有一个数据集,我正在R中使用多元回归进行探索。我的模型如下:

model<-lm(Trait~Noise+PC1+PC2)

其中NoisePC1PC2是连续协变量,用于预测同时也是连续的Trait

摘要(模型)调用显示,NoisePC1都会以相反的方式显着影响Trait中的更改。 Trait随着'噪音'的增加而增加,但随着PC1的增加而减少。

为了梳理这种关系,我想根据原始数据集的样本大小(45)创建模拟数据集,并在我的数据中看到的参数内操作NoisePC1设定,所以:两者的高水平,两者的低水平,另一方的高水平等等......

有人可以就如何做到这一点提出一些建议吗?我对R不太熟悉,所以如果这个问题过于简单,我会道歉。

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

有点不清楚你在寻找什么(这应该是在Cross Validated上),但这是一个开始和线性回归的近似描述。

假设我有一些三维数据点(NoisePC1PC2),你说其中有45个。

x=data.frame(matrix(rnorm(3*45),ncol=3))
names(x)<-c('Noise','PC1','PC2')

这些数据随机分布在这个三维空间周围。现在我们想象另一个我们特别感兴趣的变量叫做Trait。我们认为NoisePC1PC2各自的变化可以解释Trait中观察到的一些变化。特别是,我们认为这些变量中的每一个都与Trait成线性比例,因此它只是您之前看到的基本的旧y=mx+b线性关系,但是有一个不同的斜率m每个变量。总的来说,我们想象Trait = m1*Noise + m2*PC1 + m3*PC2 +b加上一些额外的噪音(令人遗憾的是,你的一个变量名为Noise,令人困惑)。

回过头来模拟一些数据,我们只需为这些斜率选择一些值并将它们放在一个名为beta的向量中。

beta<-c(-3,3,.1) # these are the regression coefficients

所以模型Trait = m1 Noise + m2 PC1 + m3 PC2 +b也可以用简单的矩阵乘法表示,我们可以在R中用,

trait<- as.matrix(x)%*%beta + rnorm(nrow(x),0,1)

我们添加了标准差等于1的高斯噪声。

因此,这是线性回归模型的“模拟数据”。正如理智检查一样,让我们​​试试

l<-lm(trait~Noise+PC1+PC2,data=x)
summary(l)
 Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.13876    0.11159   1.243    0.221    
Noise       -3.08264    0.12441 -24.779   <2e-16 ***
PC1          2.94918    0.11746  25.108   <2e-16 ***
PC2         -0.01098    0.10005  -0.110    0.913  

请注意,我们为PC2选择的斜率相对于数据的整体变化而言非常小(0.1),因此未将其检测为统计上显着的预测变量。另外两个变量对Trait产生相反的影响。因此,在模拟数据时,您可以调整观察到的变量范围,以及回归系数beta的大小。

答案 1 :(得分:0)

这是一个简单的模拟然后拟合。我不确定这是否能回答你的问题。但这是一种非常简单的模拟方式

# create a random matrix X
N <- 500 # obs = 500
p <- 20 # 20 predictors
X <- matrix(rnorm(N*p), ncol = p) # design matrix
X.scaled <- scale(X) # scale the columns to make mean 0 and variance 1
X <- cbind(matrix(1, nrow = N), X.scaled)  # add intercept

# create coeff matrix
b <- matrix(0, nrow = p+1) 
b[1, ] <- 5      # intercept      
b[2:6, ] <- 3    # first 5 predictors are 3
b[7:11, ] <- -3  #  next 5 predictors are -3

# create noise
eps <- matrix(rnorm(N), nrow = N)

# generate the response           
y = X%*%b + eps        # response vector

#--------------------------------------------

# fit the model
X <- X[, -1] # remove the column one's before fitting
colnames(X) <- paste ("x", seq(1:p), sep="") # name the columns
colnames(y) <- "y" # name the response


data <- data.frame(cbind(y, X)) # make a dataframe

lm_res <- lm(y~., data) # fit with lm()

# the output
> lm_res$coeff 
# (Intercept)           x1           x2           x3           x4           x5 
# 4.982574286  2.917753373  3.021987926  3.067855616  3.135165773  2.997906784 
#          x6           x7           x8           x9          x10          x11 
#-2.997272333 -2.927680633 -2.944796765 -3.070785884 -2.910920487 -0.051975284 
#         x12          x13          x14          x15          x16          x17 
# 0.085147066 -0.040739293  0.054283243  0.009348675 -0.021794971  0.005577802 
#         x18          x19          x20 
# 0.079043493 -0.024066912 -0.007653293 
#