2016-02-20 31 views
1

我不完全確定爲什麼我在使用rms包和ols()函數執行簡單的多變量回歸時收到此錯誤。 lm()函數工作正常。

錯誤:

Error in datadist$limits : object of type 'closure' is not subsettable

示例數據:

dat <- structure(list(value = c(153.7, 137.2, 137.2, 137.2, 137.2, 137.2, 
137.2, 137.2, 137.2, 144.3), x1 = c(1586.30574782368, 1827.63764435891, 
1274.37779664208, 1470.22193641518, 1424.71486797217, 1588.96099774091, 
1768.09933607758, 1447.4030640002, 1586.11159875168, 1741.04342002899 
), x2 = c(9.37073885963036, 79.466637406771, 3.07432642677304, 
5.32614246511366, 9.65257915442635, 9.70809241832467, 47.0161105721418, 
39.7744598414865, 13.2940602286908, 26.6250313249184)), .Names = c("value", 
"x1", "x2"), row.names = c(NA, 10L), class = "data.frame") 

使用ols型號:

library(rms) 
datadist <- datadist(dat) 
options("datadist" = "datadist") 

mod <- ols(log(value) ~ x1 + x2, data = dat, x = TRUE, y = TRUE) 

> mod <- ols(log(value) ~ x1 + x2, data = dat, x = TRUE, y = TRUE) 
Error in datadist$limits : object of type 'closure' is not subsettable 

型號使用lm

> mod <- lm(log(value) ~ x1 + x2, data = dat) 
> summary(mod) 

Call: 
lm(formula = log(value) ~ x1 + x2, data = dat) 

Residuals: 
     Min  1Q Median  3Q  Max 
-0.032746 -0.021049 -0.004316 0.010937 0.080848 

Coefficients: 
       Estimate Std. Error t value Pr(>|t|)  
(Intercept) 4.7514306 0.1487970 31.93 7.64e-09 *** 
x1   0.0001335 0.0001019 1.31 0.232  
x2   -0.0009582 0.0007205 -1.33 0.225  
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 0.03755 on 7 degrees of freedom 
Multiple R-squared: 0.2261, Adjusted R-squared: 0.004997 
F-statistic: 1.023 on 2 and 7 DF, p-value: 0.4077 
+0

'datadist'是一個函數,'$'操作符沒有爲函數(閉包)定義。 (這就是「關閉」類型的對象不是子集合「)說的) – Jthorpe

回答

1

你通過調用數據"datadist"混淆datadist()。試試這個:

d <- datadist(dat) 
options(datadist = "d") ## don't need quotes around argument name ... 
mod <- ols(log(value) ~ x1 + x2, data = dat, x = TRUE, y = TRUE) 

對於弗蘭克·哈勒爾的rms作者(其迴歸建模策略本書是太棒了),存儲選項的這種方式(即節省了名稱的對象的和通過名稱從環境中檢索它)有點微妙,並可能在這樣的情況下搞砸。

這樣的問題也是爲什麼經驗豐富的開發用戶通過給其他對象相同的名稱(datadist)提示功能(datadist()掩蓋的名字。 R是通常是聰明得足以弄清楚你的意思,但在相對罕見的情況下,它會讓人感到困惑,這些症狀通常很模糊,很難調試。 (這也是爲什麼你不應該爲你的數據框命名爲datadf ...)

+0

謝謝。我正在慢慢閱讀本書並學習這個軟件包,所以這些問題隨着我的工作而出現。謝謝您的幫助。 – Vedda