How do you do a regression using your package?


#1

How do I do I simple linear regression using your framework? Your operations are not clear… It fails on taking an inverse and cal of the betas . XtX and XtY are correct.

    let x: Vec<f64> = vec![1.0,1.0,1.0,1.0,1.0,3.0,1.0,5.0,2.0,4.0,5.0,4.0,6.0,4.0,6.0];
    let y: Vec<f64> = vec![3.0,1.0,8.0,3.0,5.0];

    let X = DMatrix::from_iterator(
        5,
        3,
        x
            .iter()
            .cloned(),
    );

    

    let mut Y = DMatrix::from_iterator(
        5,
        1,
        y
            .iter()
            .cloned(),
    );

let XX = &X.transpose()*&X;
let XY = &X.transpose()*&Y;

let XX_inv = &XX.try_inverse();
let beta = &XX_inv*&XY;

error[E0369]: binary operation * cannot be applied to type &std::option::Option<na::Matrix<f64, na::Dynamic, na::Dynamic, na::VecStorage<f64, na::Dynamic, na::Dynamic>>>
–> src/arima_estimation.rs:101:16
|
101 | let beta = XX_inv*XY;
| ^^^^^^^^^
|
= note: an implementation of std::ops::Mul might be missing for &std::option::Option<na::Matrix<f64, na::Dynamic, na::Dynamic, na::VecStorage<f64, na::Dynamic, na::Dynamic>>>


#2

Hi!

The error message you are getting:

error[E0369]: binary operation * cannot be applied to type
&std::option::Option<na::Matrix<f64, na::Dynamic, na::Dynamic, na::VecStorage<f64, na::Dynamic, na::Dynamic>>>

means there is no multiplication defined on an &Option<Matrix<...>> type. This is expected because that would not make sense for the None variant of the Option. What you need to do is to retrieve the value inside of the Option if the inversion succeeded and deal with the case where the inversion failed otherwise:

if let Some(XX_inv) = XX.try_inverse() {
  // Inversion succeeded.
  let beta = &XX_inv * &XY;
} else {
  // Deal with the case where inversion failed.
}

Also, as a side note, note that you can do X.transpose() * &Y (and X.transpose() * &X) more efficiently by using the tr_mul method: X.tr_mul(&Y).


#3

Thanks I will try that out. Actually figured out how to use the svd to solve:

let svd = SVD::new(X.clone(), true, true);  //compute u compute v
let betas = svd.solve(&Y,0.0001);
println!("betas {} {} {}",betas[0],betas[1], betas[2]);