2014-11-24 96 views
0

多元回归我有我采用多元回归的R.我的模型如下探索数据集:创建仿真数据中的R

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

其中NoisePC1PC2是预测连续协变量一个特定的Trait也是连续的。

摘要(模型)调用表明,无论NoisePC1显著影响变化Trait,只是以相反的方式。 “噪音”增加时Trait增加,但随着PC1增加而减少。为了弄清楚这种关系,我想根据我原始数据集的样本大小(45)以及在我的数据集中看到的参数中操作NoisePC1来创建模拟数据集,因此:两者都是低水平的,高的一个和低的另一个等等......

有人可以提供一些建议如何做到这一点?我不太熟悉R,所以如果这个问题过于简单,我很抱歉。

谢谢你的时间。

+0

您究竟想要如何创建这些模拟数据集?你是在寻求统计建议,还是真的是一个特定的编程问题。如果前者,可能会在[stats.se]中提问;如果是后者,则用样本输入和期望的输出创建一个[可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – MrFlick 2014-11-24 21:56:17

+1

您似乎没有意识到可能会担心这些预测变量之间的相关性,我没有看到您已经检查过非线性函数关系的可能性。如果你遵循下面的关于keegans的建议,你不会对你的关系有任何洞见,因为他只提供最简单的数据关系,可能会产生你所看到的边际估计。 – 2014-11-24 22:48:08

回答

1

这是有点不清楚你在找什么(这应该可能在交叉验证),但这里有一个开始和线性回归的近似描述。

比方说,我有一些三维数据点(Noise,PC1,PC2),你说他们有45个。

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

这些数据是围绕这个3维空间随机分布的。现在我们想象还有另一个我们特别感兴趣的变量,叫做Trait。我们认为Noise,PC1PC2各自的变化可以解释在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

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 
#