[英]Predicted values for new data using restricted cubic splines
我有一些數據,我正在使用受限的三次樣條建模。 我正在使用rms
包中的rcs
轉換函數來生成線性模型的轉換變量。 這是一個使用5節的例子。
library('rms')
my_df <- data.frame(
y = -4 * -100:100 + -1.5 * (-100:100)**2 + 3 * (-100:100)**3 + rnorm(201, 0, 1e5),
x = -100:100
)
mod <- lm(y ~ rcs(x, 5), data = my_df)
我適合數據后,我想找到的預測y
值的特定域x
值。 這是我現在正在做的事情:
new_data <- data.frame(x = -3:3)
predict(mod, newdata = new_data)
但是,這會生成一條警告消息:
Warning message:
In rcspline.eval(x, nk = nknots, inclx = TRUE, pc = pc, fractied = fractied) :
5 knots requested with 7 unique values of x. knots set to 5 interior values.
這意味着什么,以及發生了什么? 我預計結點位置應該已經在mod
定義,所以我不明白為什么它似乎試圖找到我給它的七個x
值的新結。 我可以通過在new_data
提供更多x
值來避免警告消息,而忽略那些我不需要的值,但我擔心predict
實際上在做什么。
根據哈德利對這個問題的評論,你不應該指望lm
與rcs
一起工作。 快速演示為什么會出現問題:
mod <- lm(y ~ rcs(x, 5), data = my_df)
new_data <- data.frame(x = -3:3)
new_data2 <- data.frame(x = -300:300/100)
plot(new_data2$x, predict(mod, newdata = new_data2), type='l')
lines(new_data$x,predict(mod, newdata = new_data), col='red')
預測取決於x值的數量,即使是相同的范圍,因此結合這些功能絕對不是一個好主意。
我相信predict
函數將在公式中查找並將其在那里找到的變量替換為newdata
的變量。 訣竅是, rcs
函數根據提供的數據(分布)確定結的位置。 因此,如果new_data
中的數據與my_df
的數據具有不同的分布,則結將位於不同的位置,並且它將改變曲線。 無論如何,固定結位置可以解決問題。
要修復結點位置,你不能使用rcs
函數,而是使用rcspline.eval
函數,它將結點位置作為參數。 您可以使用相同的函數來計算結“應該”的位置。 見下面的代碼。
Knots <- rcspline.eval(my_df$x, knots.only = TRUE) # returns only locations of knots
# see ??Hmisc::rcspline.eval for details of how it determines knot locations
mod2 <- lm(y ~ rcspline.eval(x, knots = Knots), data = my_df) # fit model
predict(mod2, newdata = new_data) # predict based on mod2 and new data
由於mod2
公式包含結點位置,因此曲線應為相同的形狀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.