2011-02-10 65 views
6

我想在R函數中調用預測(...)。我遇到了一些與範圍有關的問題,但我無法弄清楚什麼是錯誤或如何解決它。誰能幫忙?例如:在R函數中調用預測()

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60)) 
summary(df) 
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df) 
summary(logit.model) 

PredictOnNewData <- function() { 
    df <- data.frame(x=51:100) 
    df$probability <- round(predict(logit.model, df, type="response"), digits=3) 
    return(df) 
} 

PredictOnNewData() 

最後一行失敗:

錯誤$<-.data.frame*tmp*, 「概率」,值= C(0.274,0.282, :更換已20行,數據具有 50此外:警告消息: 'newdata' 有50行,但變量(多個) 發現有20行

如果我正確理解錯誤信息,它看起來像我正在傳遞的df對象預測(...)正在作爲父/全局環境中的df進行評估。那個有20行,用於訓練。但是我希望呼叫能夠預測(...)在其他 df數據幀上 - 我在PredictOnNewData函數中創建的數據幀。我怎麼能做到這一點(不改變我的數據幀的名稱)?

[現在我重新讀了這篇文章 - 我是否會倒退?在該行(df $概率< - ...)中,其中一個dfs正在以錯誤的方式進行評估,但是這是什麼?]

我也試過get(「df」,envir = sys。幀()),要明確提到想在目前的功能框架限定的DF對象:

PredictOnNewData <- function() { 
    df <- data.frame(x=51:100) 
    # df$probability <- round(predict(logit.model, df, type="response"), digits=3) 
    df$probability <- round(predict(logit.model, get("df", envir=sys.frame()), type="response"), digits=3) 
    return(df) 
} 

PredictOnNewData() 

...返回相同的誤差作爲最後一次。

請幫忙!


絕對可以在數據幀上調用大於被用作訓練數據的數據。一個例子(運行正常):

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60)) 
summary(df) 
logit.model <- glm(df$binary.outcome ~ df$x, family=binomial("logit"), data=df) 
summary(logit.model) 
df <- data.frame(x=1:100) 
df$probability <- round(predict(logit.model, df, type="response"), digits=3) 
df 

這正是我想做的事 - 除了我想通過一個函數來創建的第二個自由度。我怎樣才能做到這一點?

回答

8

如果您希望predict正常工作,您應該正確使用數據和公式參數。 data參數是一個數據框,公式參數由列名和(公式)運算符組成。我也不喜歡在開發領域範圍之外的隱式野外推斷,但現在我們將忽略這一點。試試這個小修改:

df <- data.frame(x=1:20, binary.outcome=1*(runif(20, 0, 1) > 0.60)) 
summary(df) 
logit.model <- glm(binary.outcome ~ x, family=binomial("logit"), data=df) 
summary(logit.model) 

PredictOnNewData <- function() { 
    df <- data.frame(x=51:100) 
    df$probability <- round(predict(logit.model, newdata=df, type="response"), digits=3) 
    return(df) 
} 

PredictOnNewData()