Вы просили о гибкости, и я вроде предоставил это здесь. Основная проблема заключается в обработке имен коэффициентов, создаваемых poly
, чтобы сделать их красивыми для человека. Обратите внимание, что решение, которое я здесь предоставляю, предполагает каждый термин в вашей модели обернут в poly
, за исключением перехвата.
MyData = data.frame(x3=runif(100),x4=runif(100))
MyData$z = 0.17 -1.13*MyData$x3^2-17.35*MyData$x3*MyData$x4+rnorm(100)
model <- lm(z~poly(x3,x4, degree=2,raw=TRUE), MyData)
summary(model)$coef
Ваш вопрос не включает воспроизводимый образец, поэтому я создал его. Приведенная ниже функция предназначена для обработки имени множителя и получения вместо него хорошего имени типа x3
, x4
.
processPolyNames = function(coef){
members = strsplit(mgsub::mgsub(coef,c("poly\\(",", degre.*"),c("","")),", ")[[1]]
degree = as.numeric(strsplit(strsplit(coef,")")[[1]][2],"\\.")[[1]])
coef_out = ""
for(d in seq_along(degree)){
if(degree[d] == 0) next
if(degree[d] == 1){
if(coef_out == ""){
coef_out = members[d]
} else {
coef_out = paste0(coef_out,"*",members[d])
}
} else {
if(coef_out == ""){
coef_out = paste0(members[d],"^",degree[d])
} else {
coef_out = paste0(coef_out,"*",members[d],"^",degree[d])
}
}
}
return(coef_out)
}
Теперь мы извлекаем коэффициенты модели - если вы хотите включить только значимые эффекты, вы можете отфильтровать coefs
. Затем я lapply
функция, которую я написал для уродливых имен, чтобы получить красивые имена.
coefs = summary(model)$coef[,1]
prettyNames = lapply(names(coefs)[-1],processPolyNames)
unlist(prettyNames)
#> [1] "x3" "x3^2" "x4" "x3*x4" "x4^2"
Теперь нам нужно сделать красивую модель. Это просто цикл. Начиная с перехвата, мы затем просто строим модель (округляя коэффициенты до 7 значащих цифр.
prettyModel = ""
for(i in seq_along(coefs)){
if(i == 1){
prettyModel = paste0(prettyModel,round(coefs[i],7))
} else {
prettyModel = paste0(prettyModel,ifelse(coefs[i] >= 0,"+",""),round(coefs[i],7),"*",prettyNames[[i-1]])
}
}
prettyModel
#> [1] "0.1169037+1.8662887*x3-3.0333651*x3^2-1.3031079*x4-17.1641031*x3*x4+1.5259313*x4^2"
Тогда эта модель может быть mgsub
', чтобы заменить переменные ссылками на ячейки Excel по желанию.