2014-04-20 148 views
2

我在R多變量貝葉斯迴歸(數值變量取決於3個說明因子變量)與MCMCregress函數MCMCpack package函數運行。R:多變量貝葉斯迴歸與MCMCregress引發錯誤

不幸的是,我的數據集拋出了一個錯誤"Error in eval(expr, envir, enclos) : NA/NaN/Inf in foreign function call (arg 17)"

下面是一個例子代碼,再現了我的迴歸任務和錯誤:

require(MCMCpack) 

# Function for creation of a reproducable example 
set.seed(0) 
example.dataframe= function(size) { 
    y= runif(size, 1, 25) 
    x1=paste(letters[runif(size, min=1, max=25)]) 
    x2=paste(letters[runif(size, min=1, max=25)]) 
    x3=paste(letters[runif(size, min=1, max=25)]) 
    df= data.frame(y, x1=as.factor(x1), x2=as.factor(x2), x3=as.factor(x3)) 
    df 
} 

### Bayesian linear regression with small dataset 
df= example.dataframe(10) 
model <- MCMCregress(y ~ x1 + x2 + x3 - 1, data= df) 
# Fails ! 
# Error in eval(expr, envir, enclos) : 
# NA/NaN/Inf in foreign function call (arg 17) 

當數據幀是更大的不拋出的錯誤:

### Bayesian linear regression with bigger dataset 
df= example.dataframe(100) 
model <- MCMCregress(y ~ x1 + x2 + x3 - 1, data= df) 
# Works ! 

summary(model) 
# Iterations = 1001:11000 
# Thinning interval = 1 
# Number of chains = 1 
# Sample size per chain = 10000 
# 
# 1. Empirical mean and standard deviation for each variable, 
# plus standard error of the mean: 
# 
#    Mean  SD Naive SE Time-series SE 
# x1a  5.13964 7.823 0.07823  0.07520 
# x1b  14.05264 7.289 0.07289  0.07289 
# ... 

我一直在尋找進入CRAN documentation of the package但沒有找到明確的錯誤提示,這是因爲。

任何建議爲什麼在第一種情況下拋出錯誤,而不是在第二種情況下拋出錯誤?

+0

你有更多的預測指標比觀察... –

+0

你沒有足夠的自由度來估計任何東西。由於您從超過10個字母的池中繪製10個字母,因此每個x1,x1,x3可以有10個級別。有100個數據點,但稍微好一點。只要嘗試擬合線性模型以瞭解發生了什麼。 – rawr

+0

謝謝,明白了。是否有可能將我的小數據框限制爲可通過迴歸處理的那些行? – user2030503

回答

1

基本問題是,對於較小的數據集,您沒有足夠的信息來估計模型中的參數(也就是說,您沒有自由度)。如果運行經典線性迴歸,則會看到模型的R平方,而較小的數據爲1.換句話說,迴歸模型解釋了其平均值周圍100%的結果變化。

要明確,這個問題與MCMCregress無關。以下是使用R中的線性迴歸函數的較小數據集,它顯示了類似的錯誤消息:

# data set 
set.seed(0) 
example.dataframe= function(size) { 
y = runif(size, 1, 25) 
x1 = paste(letters[runif(size, min=1, max=25)]) 
x2 = paste(letters[runif(size, min=1, max=25)]) 
x3 = paste(letters[runif(size, min=1, max=25)]) 
df = data.frame(y, x1=as.factor(x1), x2=as.factor(x2), x3=as.factor(x3)) 
df 
} 

# classical linear regression with small data set 
df = example.dataframe(10) 
model <- lm(y ~ x1 + x2 + x3 - 1, data= df) 
# notice the R-squared is 1 
# also notice a similar error message as with MCMCregress 

那麼解決方案是什麼?要麼使用完整的數據集,要麼減少估計的參數數量(也就是說,不要在等式的右邊使用盡可能多的輸入)。這兩個過程都會增加模型的自由度。

下面是一個使用這兩種方法沒有錯誤的例子:

# (1) solution 1: fewer parameters estimated 
df = example.dataframe(10) 
model <- MCMCregress(y ~ x1, data= df) 

# (2) solution 2: more data used 
df = example.dataframe 
model <- lm(y ~ x1 + x2 + x3 - 1, data= df) 

對於您可能希望對degrees of freedom從統計概念讀了更多的信息。

更新:還有另一種解決方案。您可以使用諸如因子分析等降維技術將方程右側的變量組合爲更小的變量。這裏有一個最原始的例子:

# (3) solution 3: dimension reduction (e.g., factor analysis) 
require(psych) # for "fa" function 
df$x1 <- as.numeric(df$x1); df$x2 <- as.numeric(df$x2) 
df$x3 <- as.numeric(df$x3) 
fa <- fa(df[,2:4], rotate="varimax") 
model <- lm(y ~ fa$scores) 

最終試圖估計更多的參數比數據就像水變成酒或稻草變黃金 - 這是不可能的。你唯一的希望就是你可以估計更少的參數,獲得更多的數據,並且認識到你的一些變量實際上是相互替代的(或者組合起來形成一組較小的潛變量)。

+0

不幸的是,減少x2和x3並不合適。將我的小數據框限制到那些可以通過迴歸處理的行有幫助嗎?如果是這樣,如何在R中編碼? – user2030503