Цитата(ИНО @ 4.05.2025 - 22:36)

Окзалось, что нельзя вот-так просто вставить в готовую функцию пользовательские коэффициенты, и заставить программу посчитать статистики по остаткам.
Я предположил, что функция nls для Вас может подойти лучше, так как присутствует ручная установка коэффициентов. Попробовал смастерить (правда для lm) эквивалентные реализации, можете ознакомиться.
CODE
testdata <- data.frame(
group = factor(
c(rep("A", 7), rep("B", 6))
),
time = c(
15, 17, 18, 19, 20, 21, 22,
15, 18, 19, 20, 21, 22
),
response=c(
1.078, 0.949, 0.793, -2.201, -1.181, -1.95, -2.391,
2.628, 2.525, 2.852, 2.811, 3.484, 2.206
)
)
fit <- lm(response~I(time^2):group,
data = testdata)
fit1 <- fit
fit1$coefficients <- c(1, 2, 3)
fit1$fitted.values <- predict(fit1)
fit1$residuals <- fit$fitted.values-fit1$fitted.values
fit2 <- lm(
response ~ -1 +
offset(I(rep(1, 13))) +
offset(
I(
ifelse(group == 'A', I(time^2)*2, 0)
)
) +
offset(
I(
ifelse(group == 'B', I(time^2)*3, 0)
)
)
,
data = testdata
)
fit3 <- nls(
response ~ c +
ifelse(group == 'A', I(time^2)*a, 0) +
ifelse(group == 'B', I(time^2)*b, 0),
start = list(c = 1, a = 2, b = 3),
lower = list(b = 1, a = 2, b = 3),
upper = list(b = 1, a = 2, b = 3),
data = testdata, algorithm = 'port'
)
rsq <- function(actual, predicted) {
ss_total <- sum((actual - mean(actual)) ^ 2)
ss_residual <- sum((actual - predicted) ^ 2)
r_squared <- 1 - (ss_residual / ss_total)
return(r_squared)
}
Также бегло посмотрел stackoverflow по схожим вопросам. все упирается в умение решать задачи по (не)линейному программированию, самому писать функции и т.д., что неудивительно.