我有一个数据集,我正在R中使用多元回归进行探索。我的模型如下:
model<-lm(Trait~Noise+PC1+PC2)
其中Noise
,PC1
和PC2
是连续协变量,用于预测同时也是连续的Trait
。
摘要(模型)调用显示,Noise
和PC1
都会以相反的方式显着影响Trait
中的更改。 Trait
随着'噪音'的增加而增加,但随着PC1
的增加而减少。
为了梳理这种关系,我想根据原始数据集的样本大小(45)创建模拟数据集,并在我的数据中看到的参数内操作Noise
和PC1
设定,所以:两者的高水平,两者的低水平,另一方的高水平等等......
有人可以就如何做到这一点提出一些建议吗?我对R不太熟悉,所以如果这个问题过于简单,我会道歉。
感谢您的时间。
答案 0 :(得分:1)
有点不清楚你在寻找什么(这应该是在Cross Validated上),但这是一个开始和线性回归的近似描述。
假设我有一些三维数据点(Noise
,PC1
,PC2
),你说其中有45个。
x=data.frame(matrix(rnorm(3*45),ncol=3))
names(x)<-c('Noise','PC1','PC2')
这些数据随机分布在这个三维空间周围。现在我们想象另一个我们特别感兴趣的变量叫做Trait
。我们认为Noise
,PC1
和PC2
各自的变化可以解释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
#