问题描述
这是我的linreg函数,用于计算多元回归并返回RC对象。
此函数将公式和数据框作为输入,并进行一些回归分析,然后返回RC类型的对象。 我将在计算结束时创建RC对象,然后返回一个新的RC对象。
data_name <- deparse(substitute(data))
X <- model.matrix(formula,data)
y_col <- data[all.vars(formula)[1]]
y <- as.matrix(y_col)
X[is.na(X)] <- 0
transpose_X <- t(X)
X_tranp_inversion <- solve(transpose_X %*% X)
beta_hat <- X_tranp_inversion %*% (transpose_X %*% y)
fitted_value_y_hat <- X %*% beta_hat
residuals <- y- fitted_value_y_hat
degree_freedom <- nrow(X) - ncol(X)
variance_sqr <- (t(residuals) %*% residuals) / degree_freedom
variance_beta <- as.vector(variance_sqr) * diag(X_tranp_inversion)
parameters <- diag(X_tranp_inversion)
parameters_names <- names(parameters)
t_value <- NA
t_value <- beta_hat/ sqrt(variance_beta)
p_value <- 2*pt(-abs(t_value),degree_freedom)
linreg <- setRefClass("linreg",fields = list(name = "character",data = "data.frame",parameters = "numeric",parameters_names = "character",residuals = "vector",predicted_y = "vector",coefficent = "vector")
)
linreg$methods(show = function(){
cat("Call:\n")
cat(paste0(.self$name,"\n"))
cat("Coefficients:\n")
names(.self$parameters) <- .self$parameters_names
print(.self$parameters)
})
linreg$methods(initialize = function(name = "",formula_name = "",data_name = "",dataframe,param,param_names,resid,pred_y){
#dataframe_name <- deparse(substitute(dataframe))
.self$data <<- dataframe
formula_vars <- as.character(formula_name)
.self$name <<- paste0("linreg(formula = ",formula_vars[2],formula_vars[1],formula_vars[3],",data = ",data_name,")\n")
.self$parameters <<- param
.self$parameters_names <<- param_names
names(.self$parameters) <- parameters_names
.self$coefficent <<- .self$parameters
.self$residuals <<- as.vector(resid)
.self$predicted_y <<- as.vector(pred_y)
.self$show()
})
linreg$methods(plot = function(){
ggplot2::qplot(Sepal.Length,Petal.Length,data = data)
})
linreg$methods(summary = function(){
cat("i'm summary")
})
linreg$methods(resid = function(){
return(.self$residuals)
})
linreg$methods(pred = function(){
return(.self$predicted_y)
})
linreg$methods(coef = function(){
return(coefficent)
})
return(linreg$new(formula_name = formula,data_name = data_name,dataframe = data,param = parameters,param_names = parameters_names,resid = residuals,pred_y = fitted_value_y_hat))
}
下面是我运行的测试用例,其他人编写了这些,但我必须通过这些测试用例
context("linreg")
data("iris")
polygon <- setRefClass("polygon",fields = c("sides"))
square <- polygon$new(sides = 4)
test_that("lenreg rejects errounous input",{
expect_error(linreg_mod <- linreg$new(formula = Petal.Length~Sepdsal.Width+Sepal.Length,data=iris))
expect_error(linreg_mod <- linreg$new(formula = Petal.Length~Sepdsal.Width+Sepal.Length,data=irfsfdis))
})
test_that("class is correct",{
linreg_mod <- linreg$new(Petal.Length~Sepal.Width+Sepal.Length,data=iris)
expect_true(class(linreg_mod)[1] == "linreg")
})
test_that("print() method works",data=iris)
expect_output(linreg_mod$print(),"linreg\\(formula = Petal\\.Length ~ Sepal\\.Width \\+ Sepal\\.Length,data = iris\\)")
expect_output(linreg_mod$print(),"( )*\\(Intercept\\)( )*Sepal\\.Width( )*Sepal\\.Length")
})
test_that("pred() method works",data=iris)
expect_equal(round(unname(linreg_mod$pred()[c(1,5,7)]),2),c(1.85,1.53,1.09))
})
test_that("resid() method works",data=iris)
expect_equal(round(unname(linreg_mod$resid()[c(7,13,27)]),c(0.31,-0.58,-0.20))
})
test_that("coef() method works",data=iris)
expect_true(all(round(unname(linreg_mod$coef()),2) %in% c(-2.52,-1.34,1.78)))
})
test_that("summary() method works",data=iris)
expect_output(linreg_mod$summary(),"\\(Intercept\\)( )*-2.5[0-9]*( )*0.5[0-9]*( )*-4.4[0-9]*( )*.*( )*\\*\\*\\*")
expect_output(linreg_mod$summary(),"Sepal.Width( )*-1.3[0-9]*( )*0.1[0-9]*( )*-10.9[0-9]*( )*.*( )*\\*\\*\\*")
expect_output(linreg_mod$summary(),"Sepal.Length( )*1.7[0-9]*( )*0.0[0-9]*( )*27.5[0-9]*( )*.*( )*\\*\\*\\*")
expect_output(linreg_mod$summary(),"Residual standard error: 0.6[0-9]* on 147 degrees of freedom")
})
test_lab4.R:14:错误:类正确 类型为'closure'的对象不可子集化
我遇到上述错误。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)