2016-09-19 9 views
4

У меня есть коэффициенты из glm, установленного в R, и я хочу предсказать ожидаемые значения для нового набора данных. Если бы у меня был модельный объект, это было бы просто, используя pred(). Тем не менее, я сейчас вне офиса и по причинам конфиденциальности данных у меня больше нет объекта модели. У меня есть только суммарный объект, сгенерированный с использованием summary (model), который содержит коэффициенты модели.Как предсказать из параметров сплайна ns без объекта модели

Достаточно просто использовать коэффициенты для прогнозирования ожидаемых значений для простой модели. Однако я хотел бы знать, как это сделать, когда модель включает кубический сплайн ns(). Любые сочетания клавиш, когда модель также включает категориальные переменные, также будут оценены.

Вот простой пример.

library(splines) 
dat <- data.frame(x=1:500, z=runif(500), k=as.factor(sample(c("a","b"), size=500, replace=TRUE))) 
kvals <- data.frame(kn=c("a","b"),kv=c(20,30)) 
dat$y = dat$x + (40*dat$z)^2 + kvals$kv[match(dat$k,kvals$kn)] + rnorm(500,0,30) 
# Fit model 
library(splines) 
mod <- glm(y ~ x + ns(z,df=2) + k,data=dat) 
# Create new dataset 
dat.new <- expand.grid(x=1:3,z=seq(0.2,0.4,0.1),k="b") 
# Predict expected values in the usual way 
predict(mod,newdata=dat.new) 
summ <- summary(mod) 
rm(mod) 
# Now, how do I predict using just the summary object and dat.new? 
+0

http://stats.stackexchange.com/a/101484/11849 – Roland

+0

Если вы используете функцию htat не в базовом наборе, вы всегда должны добавить необходимый вызов библиотеки. –

ответ

1

Там, наверное, более эффективный метод для решения, но вот отправная точка, чтобы вы создали для реализации стратегии кратко Roland предложили. Объект summ имеет информацию, необходимую для определения функции сплайна, но это своего рода погребен

names(summ) 
    [1] "call"   "terms"   "family"   "deviance"  "aic"   
    [6] "contrasts"  "df.residual" "null.deviance" "df.null"  "iter"   
    [11] "deviance.resid" "coefficients" "aliased"  "dispersion"  "df"    
    [16] "cov.unscaled" "cov.scaled"  

И, глядя на структуру terms листа, мы видим, что деталь сплайна похоронена еще глубже внутри predvars subleaf :

str(summ$terms) 
Classes 'terms', 'formula' language y ~ x + ns(z, df = 2) + k 
    ..- attr(*, "variables")= language list(y, x, ns(z, df = 2), k) 
    ..- attr(*, "factors")= int [1:4, 1:3] 0 1 0 0 0 0 1 0 0 0 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:4] "y" "x" "ns(z, df = 2)" "k" 
    .. .. ..$ : chr [1:3] "x" "ns(z, df = 2)" "k" 
    ..- attr(*, "term.labels")= chr [1:3] "x" "ns(z, df = 2)" "k" 
    ..- attr(*, "order")= int [1:3] 1 1 1 
    ..- attr(*, "intercept")= int 1 
    ..- attr(*, "response")= int 1 
    ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
    ..- attr(*, "predvars")= language list(y, x, ns(z, knots = structure(0.514993450604379, .Names = "50%"), Boundary.knots = c(0.00118412892334163, 0.99828373757191), intercept = FALSE), k) 
    ..- attr(*, "dataClasses")= Named chr [1:4] "numeric" "numeric" "nmatrix.2" "factor" 
    .. ..- attr(*, "names")= chr [1:4] "y" "x" "ns(z, df = 2)" "k" 

Так вытащить атрибут из:

str(attributes(summ$terms)$predvars) 
language list(y, x, ns(z, knots = structure(0.514993450604379, .Names = "50%"), 
       Boundary.knots = c(0.00118412892334163, 0.99828373757191), intercept = FALSE), k) 

Вы можете видеть, что это ро ssible восстановить сплайн, если поставить значения х, у, г, и К, необходимых:

with(dat, ns(z, knots = 0.514993450604379, Boundary.knots = c(0.00118412892334163, 
0.99828373757191), intercept = FALSE)) 
#--- 
       1    2 
    [1,] 5.760419e-01 -1.752762e-01 
    [2,] 2.467001e-01 -1.598936e-01 
    [3,] 4.392684e-01 4.799757e-01 
snipping .... 
[498,] 4.965628e-01 -2.576437e-01 
[499,] 5.627389e-01 1.738909e-02 
[500,] 2.393920e-02 -1.611872e-02 
attr(,"degree") 
[1] 3 
attr(,"knots") 
[1] 0.5149935 
attr(,"Boundary.knots") 
[1] 0.001184129 0.998283738 
attr(,"intercept") 
[1] FALSE 
attr(,"class") 
[1] "ns"  "basis" "matrix" 

Вы можете создать заменитель dat, если вы знаете, экстремумы ваших данных. См. ?ns и другие страницы справки, на которые он ссылается.