2014-11-24 92 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 
#