Are There PID Controllers in Data Science?

A while back I went to a data science meetup, and the presentation was on how an analyst solved his problem with a PID controller. As an engineer I’m well familiar with PID controllers. I spent a lot of time studying them in school. The problem in this scenario was optimizing the amount and cost of ad impressions in a given day. My first thought when I saw it was that this isn’t data science. You’d think that with the amount of data available that a regression or decision tree might work better. I’ve thought about this quite a bit since then, and my view has changed. In fact, I now his approach is brilliant in its simplicity.

PID Controller

By TravTigerEE of Wikepedia

For those not familiar, a Proportional Integral Derivative controller is a control-feedback loop that automates the control of systems. That’s a fancy way of saying that they control an input and monitor the output. If there’s a difference between the output and the desired output, the input is adjusted to account for this error. The first designs were for steering a ship, automating the task of maintaining a heading when there are wind or currents to account for. These aren’t new, the first designs were completed in the 1920’s, and today they’re commonplace. In fact, you’ve used them.

Your home’s thermostat is a PID controller. The input is whether or not to turn on your air conditioner or heater, the desired output is the temperature you want, and it measures the inside temperature. Most cars these days have cruise control, that’s another example of a PID controller that we use on a daily basis. An aircraft autopilot is a more complex example, as it maintains heading, altitude and airspeed. Your computer’s hard drive uses a PID controller to position its head on the platter. And they’re used extensively in manufacturing and industrial applications.

Some of the more cool or exotic uses of PID controllers are in a car’s suspension system, to make the ride ultra smooth. NASA uses them on their launch platforms to aid in keeping rockets balanced upright. Recently SpaceX and Blue Origin have autonomously landed rockets through the use of advanced control systems. And Boston Dynamics has created a number of awesome walking robots that maintain balance across slippery or rugged terrain. Some of these applications are quite a bit more advanced than the simple PID controller, but they definitely contain PID controllers.

By now hopefully you can see why I’d question whether PID controllers would be considered a data science tool. Certainly they’re useful, and if you find an application where they’ll work then its a great choice because they’re well documented, relatively easy to implement, and once they’re tuned they require little maintenance. These are all great attributes, and yet I wouldn’t expect them to be covered in a statistics course. Or a computer science course. The math behind PID controllers is calculus. In my own education, I studied a lot of calculus and these were only covered in my engineering coursework.

In fact, if we look at common data science tools, PID controllers are absent. One of the great reasons for choosing R over another language is that there are packages for everything. A Johns Hopkins professor even created a popular video proclaiming There’s an R Package for That, playing on the popular cell phone map ads from a few years ago. And yet, if you do a search there is no PID controller package for R. There is a blog post showing how to create one, but no package. And what about Python’s data science library scikit-learn? Nope. Data science upstart Julia? No. Not even Apache’s Hadoop or Spark frameworks have pre-built algorithms for a PID controller.

These data science packages and libraries are all designed to make sense of thousands (or more) rows of hundreds of variables. A PID controller reads one thing and controls another. PID controllers don’t work with big data. And yet, they’re incredibly useful in applications where we work with data.

So now lets pay closer attention to the data science side. A popular post over the past few years has been Drew Conway’s data science Venn diagram. One of the 3 primary components is hacking skills. Conway partly explains this as discovery and building knowledge via hypotheses and experimentation. That means figuring out how to get things done. You aren’t limited to what libraries have to offer. If you have domain experience and can simplify your problem to the point that a PID controller accomplishes what you need, that’s valuable no matter what you call it. I’d say that fits within data science.

It has also occurred to me that there are a few other data science applications not covered universally by data science tools. Collaborative filtering and A/B testing are both definitely in the realm of data science, and yet if you choose one of these methods for your project you’ll likely be coding up your own solution. Natural language processing is another example of a field within data science that calls on skills outside of a statistical model. There are definitely packages and libraries for NLP in the major languages, but this field has its own methods outside of categorization, classification or regression. And maybe that’s my point. This is data science. You do what you have to do.

Notice that I’m careful to call this data science. Another closely related moniker is machine learning. A PID controller is definitely not machine learning, nor knowledge discovery nor operations research nor data mining. This is not a method for classification or clustering. There is no model being created. This isn’t Frequentist or Bayesian. PID controllers can definitely be useful for solving data science problems, but they cannot predict anything.

What are some potential use cases where a data scientist might choose a PID controller? As a generic answer I’d say anywhere that you believe there’s a direct relationship between a variable that you control and an output that you monitor. The data stream should be continuous, or at least assumed continuous. The example that lead to this thought is perfect, controlling the number of ad impressions by adjusting the bid price in an auction. In this example, your ads are up and running 24 hours a day, 7 days a week, and you know almost instantly how many impressions you earned.

I actually think PID controllers could work well for a lot of problems with the online realm. Buying online ads, budget pacing and load balancing come to mind. There are probably areas within SEO where it would help.

This would not work as well for optimizing football game attendance by adjusting ticket prices. In this scenario the data is not continuous, there are days or months between events. There are also too many other variables at play. If temperatures are below freezing then ticket price probably isn’t a factor in game attendance, people won’t be as willing to sit in the cold. If the game is post-season then temperature probably isn’t a factor, people will attend regardless of temperature because they’re excited to see their team in the playoffs. These are guesses, but hopefully you see my point.

My own conclusion in this is that, yes, PID controllers are fair game within the realm of data science. The realm of controllers is stable, mature, and is still an area of active research. If you find a scenario where a PID controller gives you the results you’re looking for, then its absolutely a good choice.

Aim Bigger

Gree-Red-AppleOver the past few years I’ve done quite a bit of research on A/B testing. Initially I wanted to understand how to apply them within my own work. I quickly became interested in designing tests and interpreting results in various scenarios. Then I wanted to understand the math behind them. Then I really geeked out on them and started to reverse engineer some of the online calculators that are available.

The math of these tests is fascinating to me because there’s a bit of complexity involved. How do you decide when to end a test? How much confidence can you have that the result is correct? However complex though, ultimately there is an intuition.

The correct way do an A/B test (using frequentist inference methods, Bayesian is another topic) is to start with a hypothesis then calculate the required sample size. You start with a measure of your current metric, design a new version and form a hypothesis about how much your newer version will improve.  From there you can determine how many times your split test needs to be repeated to reach a given significance level.

For example, suppose I have a web page with a 5% success rate (clicks to some other page). I want to improve that so I try a different message. If my hypothesis is that I’ll see a 5% increase in performance, that would improve my success rate to 5.3% and require 240,000 visitors to determine whether or not I’ve achieved my goal with 95% confidence. That’s going to take a long time to complete, for any website. Long enough that it wouldn’t make sense to spend the time on it for such little gain. Plus, in this scenario I know that I’ll be showing the inferior version to at least 120k visitors.

If I raise my hypothesis to a 50% improvement, that places my target success rate to 7.5%. I only need 3,000 visitors to reach 95% confidence in this second test. That’s a more manageable number. Even on a site with meager traffic I can complete this test in a reasonable amount of time.

This doesn’t mean that I should just start hypothesizing that all of my tests will achieve a 50% improvement. In order to generate those types of results I need to start testing things that are very different from each other. In the online world, changing the color of a button isn’t going to make a 50% difference. You need to get creative and try different layouts, offers and imagery. Test small cartoons against large high resolution images. Test selling directly online versus having people go through a sales team. Test offering great sales support versus having a thorough knowledge base.

I’m also not suggesting that you shouldn’t test button colors. I do recommend testing everything that influences the behaviors you want to encourage. I wouldn’t start with this test, since this is a small difference I’d hold this one until you’ve tested other more significant factors. I also wouldn’t settle for a 5% increase.

Notice that in the above example I can complete 80 versions of the second test within the same time frame as the first. If I set my goal to a 100% improvement, I can reach significance for more than 260 individual tests in the same time frame as my original test aiming for a 5% improvement. Now we’re getting somewhere. You absolutely should test 260 different ways to improve the results you’re seeing.

Practically speaking, what does it mean if I aim for a 50% increase in performance and only achieve a 5% bump? Not much, really. Use your own judgment on whether or not to keep the new version. This isn’t the big difference that you’re looking for so make a choice (via whatever method) and move on to your next test.

As you iterate through test after test to improve results an interesting thing will happen. You’ll end up with a product, or website, or marketing campaign that you didn’t envision at the start. This is because you haven’t been the designer, your customers have. You move forward in stages without a defined path. And you’re still making progress.

These principles aren’t new and are certainly being applied in marketing and business. I’d argue that it also applies outside of work, in less tangible areas of our lives. If you want to start saving more money, test not eating out versus giving up cable TV. See which one works the best for you. As you experiment within your personal life, you don’t need an Excel spreadsheet, but I do recommend quantifying the results somehow.

A/B testing is one of the coolest aspects of online marketing, in my estimation. You start with a few ideas and work your way forward to success through iterations, improving and gaining confidence as you go. It’s amazing to see your work morph into something that people engage with. I say test all your big ideas, and look for big successes.

Protect Your Privacy

encryptedLast month I shared my concern about our diminishing privacy. Now I hope to share some ideas about how you can protect yourself. The key is encryption. Below I’ll give practical steps that you can take. I’ll cover a lot of different areas, I recommend doing as much of this as you’re comfortable with. The strategy is to encrypt everything. Most of these are easy to implement, so regardless of your background or technical ability you’ll be able to make a difference. The goal here is to become more secure in your daily life.

Your connection to the web should always be secure, which means enabling WPA2 encryption on your router at home and avoiding public networks. If you do need to surf on public wifi (coffee shops, airports, etc) then I strongly recommend that you take precautions to protect yourself. Disable sharing, turn on your firewall and use a VPN. I’ve used OpenVPN while traveling and I loved it. There are plenty of VPN services available. Protip, the Premium version of Disconnect blocks malware and is a VPN as well.

The best option here would be to avoid the companies known to have leaked to the NSA, but I’ll concede that isn’t realistic. Fortunately you have options. First, get the HTTPS Everywhere plugin for your browser and turn it on. Second, try DuckDuckGo or StartPage instead of Google, Bing or Yahoo.

Block ads & tracking scripts
Start with the simple, enable do not track within your browsers. Next, get the Disconnect browser plugin and configure it to block your browser from responding to requests. Finally, get Ad Block Plus and turn it on.

Encrypt your computer
This one used to be a challenge, but recently operating systems have appropriately taken over and now its a pretty straight forward task. For Windows you’ll enable BitLocker. For OS X you’ll turn on FileVault. Both of these are robust, well supported and easy to turn on. Just don’t forget your password. There are options for Linux as well, but my guess is that if you’re using Linux you don’t need my help.

Encrypt your data in the cloud
If you use a cloud storage service like Dropbox, Google Drive, iCloud or Box, your connection may be secure but if your files are unencrypted than anyone that gains access to those services has your pictures & files. These services have become a target for precisely this reason. There are a couple of options. If you already have files stored in one of the above services, you can use Boxcryptor or Viivo to encrypt what’s already there. These are freemium services so there’s a free option that will work for most, and a subscription option for more advanced features. They support most storage providers and most platforms, which makes them a great option. The next level would be choosing SpiderOak or Tresorit, which are zero-knowledge, secure cloud storage services. They both offer a free plan and modest fees for increased storage.

Encrypt your phone
Your phone goes everywhere with you. If it is lost or stolen, all of your data is ripe for the picking. Passwords aren’t enough to keep people out, you need to encrypt it so that the data is hidden. The good news is that it’s simple. Android, iPhone & Windows Phone each have native tools to easily enable this feature. In fact, for these devices phone encryption is just a setting.

Secure Email
This is the trickiest one of all. Until recently encrypted email has been challenging enough that for most people it wasn’t worth the effort. It’s also, in my opinion, the most important. Your email tells just about everything there is to know about you in one spot. Your friends, your interests, your calendar updates, where you bank, and more. This really could be its own series of blog posts, but my goal here is to keep things simple. For Gmail, Yahoo & Hotmail, you want Mailvelope, which is a browser plugin for Firefox or Chrome that simplifies the steps involved in PGP encryption. A better option would be to switch to a free secure email provider like ProtonMail or Tutanota. These services handle end-to-end encryption for you.

If you take these steps, you’ll both protect yourself from being a target for hacking, and protect your identity while online. Without the keys to decrypt it, it just looks like static or junk data. In fact, it IS junk data.

I’ve covered these topics pretty quickly. If you’d like to know more, I’d encourage you to do some investigating and educate yourself.


Privacy is not a crime

Image by Jürgen Telkmann via Flickr

A couple of recent events have gotten me thinking about privacy. More specifically, it’s the lack of privacy that has captured my attention. The web has now been ubiquitous for the better part of a decade. Companies earn staggering sums of money making the web an awesome experience for us. And they have, most adults I know have at least 3 devices with constant internet access. The nasty down side is that everything we do online is traceable. You would be surprised by how little data is required to uniquely identify a person, but that’s no problem because our devices betray quite a bit about us.

None of this is new, the fact that companies and the NSA track our activities has been known for 10 years or more. The two things that have struck me recently are that more companies are joining this bandwagon, and there is no way to opt out.

This summer the news lit up with stories about Windows 10 spying on you, then slipped user tracking tools into Windows 7 & 8 as well. Spotify raised quite a ruckus with an updated privacy policy enabling them to collect just about everything on your phone, pictures, location (GPS data), Facebook friends, etc. And in June Uber revealed that their mobile app could continue to monitor your location even after you exit the app.

It’s impossible to opt out of this tracking. None of us are immune from this privacy invasion. If you surf the web, if you have a cell phone, then you are sharing data about your habits and interests with companies and the government. Google & Facebook know you individually, whether or not you have an account with those services. Google’s free analytics service is used on half of the top million domains, and Facebook’s like or share buttons are present on more than 13 million websites. If you do have an account with those companies, they know a lot more about you, but don’t be fooled, they know your habits either way. The only way to avoid them is to not use the phone or surf the web.

We also have no control over what happens with this data about us. Major cell phone carriers are sharing the content, not just meta data but the actual conversations, with the NSA. There are reports from reputable journalists indicating that up to 50 companies are willingly supplying customer data to government agencies. The net effect is that the NSA collects nearly everything you do online, without user consent or a warrant.

Those are examples of the companies complying, but something this valuable is definitely a target for theft. Consider the Ashley Madison breach, last month hackers stole then released the full Ashley Madison database, including personal details. Whether or not you like the site or agree with its business model, enough data was shared about its customers that all of them are now susceptible to identity fraud. Think about that. Names, email addresses, credit card info, transaction data. These breaches aren’t limited to anonymous criminals though, the NSA is all to happy to steal data as well. They’ve stolen data in bulk from Google, Yahoo, Facebook and AT&T that we know of. Again, this is without the consent of the companies or a warrant.

Apart from the personal intrusion, though, how can you have a true democracy when everyone is being watched? We need to be free to explore and express ideas, to argue and debate, without concern for third party misinterpretation or intervention. Privacy is a means to democracy. We currently do not have this freedom, at least not via phone, email or social network. I know of at least two websites that have been forcibly shut down, secure email provider Lavabit and the social legal site Groklaw. I don’t know anything about why these sites shut down other than what’s in the news, but I somehow doubt that the owners of either website feel very free. I do know that Groklaw was a community where open source software advocates and attorneys collaborated to help one another. These heavy handed tactics discourage civic participation and sharing of ideas.

The American public deserves to know what its leaders and government are up to, both at home and abroad. Citizens cannot consent to the importance or effectiveness of any program they don’t know about. There is inherent value in citizens knowing their government’s activities and being able to form judgments about public policy. I do understand that in global politics governments need to spy on one another. That the government do this to its own people and then try to cover it up damages the relationship between citizens and their government.

I find it absolutely chilling that companies and governments have colluded to eradicate our privacy. The private sector figured out how profitable it is to offer free services and sell data about us, and the government figured out how to capture that data and use it for their own purposes. The result is that a lot of people I’ve never met and have no reason to trust know my interests, habits, background, and what I look like. They know these things about you, too. And none of us have any voice in what they choose to do with that information. It’s horrifying.

I don’t know that its possible to fully protect ourselves from this, but there are some things we can do to protect ourselves. I’ll share those ideas in a separate post.

Smoked Chicken

I got a smoker as a gift recently, so this summer has been fun with trying new recipes. Over the next few months I’ll post recipes that we’ve enjoyed. This one is for smoked chicken.

Dry Rub
¼ cup brown sugar
¼ cup sweet paprika
3 tbsp kosher salt
1 tbsp ground pepper
1 tbsp garlic powder
1 tbsp onion powder
1 tbsp chili powder
1 tbsp cayenne pepper

This makes a lot of rub, so either save it for later (trust me, you’re going to want to make this again) or cut these amounts in half. Also, don’t worry about the chili & cayenne, the flavor wasn’t hot.

The Smoking
The night before you cook the chicken, trim the fat as desired and put the rub on. When ready to cook, place the bird breast-side-down (looks upside down to me) in your smoker. Set the oven to 230 °F (110 °C), and you’ll cook until the internal temperature is 165 °F (74 °C). When done, wrap the chicken in foil and rest for 30 minutes breast-side-up.

This makes meat that is moist, tender and full of flavor. I used hickory for smoke, and it was just fantastic. Next I think I’ll try mesquite.

Famous Musicians I’ve Met

This came up a while back in a Reddit thread. It was fun to think through people I’ve met so I thought I’d share it here.

Eamon McLoughlin (fiddle player for The Greencards): I met him at a party. He had just moved to Austin to start something here. We talked for about 20 minutes, he was friendly & interesting. I approached him after a show about 5 years later, of course he didn’t remember me but he was still nice.

Sufjan Stevens: One year a friend of a friend called and asked if a songwriter could stay at our place during SXSW. We said sure. He was awesome. We chatted over coffee one morning, really nice guy. 2 years later I realized that I love his music. Sigh…

Shawn Colvin: I got to go to a private concert. Apart from her performance she was pretty quiet, but she struck me as genuine.

Southern Culture on the Skids (all of them). I approached them after a show. They were amazing. Super fun.

Johnny Goudie: I sat next to him in a coffee shop late one night. We talked for maybe an hour. He encouraged me to quit my job and become a professional musician.

Alex Griffin (bassist for Ned’s Atomic Dustbin): Approached him after a show. We talked about basses & touring. He was awesome.

Emilio Navaira: A long time ago I worked at the Majestic Theater in San Antonio. I worked back stage during the tejano music awards. He & I didn’t really hit it off.

These are all fun memories.

Data Conversions

dataConversionThe data that I work usually doesn’t arrive in the format that I need for cleaning or analyzing. After writing individual scripts each time I needed to do this conversion, I decided to take the time to create scripts that I can use repeatedly.

Initially I created these data conversion scripts in PowerShell since that’s what I was working with at the time, and later switched to Python so I can use them in any environment. They generally work the same, so use whichever is easiest for you.

My scripts accept csv, json or tsv as inputs, and can output to csv, sqlite or xml. The format to use them is filename.csv, which converts your data and outputs filename.db (filename & format dependent, of course).

Here’s a list of the conversions available:

  • csv to json
  • csv to sqlite
  • json to csv
  • json to sqlite
  • json to xml
  • tsv to csv

One quick note on converting from json to x. My scripts are only designed to work with flat json files (no nested objects or arrays). If your input json isn’t flat, my script will produce columns of nested json. If that doesn’t work for your needs, there are a couple of options. You can flatten it via a script like so (found on stackoverflow):

def flatten(structure, key="", path="", flattened=None):
    if flattened is None:
        flattened = {}
    if type(structure) not in(dict, list):
        flattened[((path + ".") if path else "") + key] = structure
    elif isinstance(structure, list):
        for i, item in enumerate(structure):
            flatten(item, "%d" % i, ".".join(filter(None,[path,key])), flattened)
        for new_key, value in structure.items():
            flatten(value, new_key, ".".join(filter(None,[path,key])), flattened)
    return flattened

Or you can hard code the conversion yourself. Here’s an example (also from stackoverflow):

for item in data:

Use, share or modify these conversion scripts as you care to.

14 Free (as in beer) Data Mining Books

I was doing some research on an algorithm this morning and came across a new book that I wasn’t aware of. That prompted me to look for more. The list of what I came up with is below.

Each of these is free-as-in-beer, which means you can download the complete version without expectation for anything in return. I think most of them are available for purchase as well, if you prefer a hard copy. Some of them include code samples in R, Python or MATLAB.

Regardless of your background, skills or goals, there’s something for you in this list. Here they are, in no particular order.

Continue reading


I recently blogged about the possibility of forgiveness as an event. As it happens, I’ve also come across notes that I wrote on this subject a couple of years ago. Here they are with only minor edits for readability.

Forgiveness is something that I’ve struggled with quite a bit as an adult. I’m generally an easy going guy, so many offenses roll off of me. It takes a lot to get me angry, but when I get really get angry it can take years to push through. If I were to run into a particular former boss, or an ex-girlfriend I probably wouldn’t come across as easy going. There are a couple of things that are helpful for me to keep in mind though. I do have to remind myself of these things.

First, I’m the one that’s negatively affected by my holding on to the offense. Lack of forgiveness is how people end up becoming bitter & hard hearted. That boss I mentioned laid me off 12 years ago, even if he still remembers there’s no way he’s as upset by it today as I am. I’m the loser here, by holding on to something in the past I’m limiting what I can see right now. Put another way, I’m the greatest benefactor when I forgive.

Second, forgiveness does not mean forgetting. Forgiveness is for my own benefit, to free myself from the animosity of harboring anger towards another. It doesn’t really have anything to do with the other person. I can choose to remain friends with the other person or not, independently of the choice to forgive. If I choose to break the relationship, it doesn’t mean I haven’t forgiven them. I have forgiven the ex-girlfriend, but I will not give her another opportunity to hurt me. A really powerful example of this for me is punishment for crimes. Forgiving someone for committing a crime doesn’t mean that they don’t get punishment. If everyone involved, victim, attorneys, judge & jury each forgave them, it would still be appropriate and just for them to receive and serve out a sentence. We don’t forget the crime, but forgiveness releases us from it controlling our thoughts.

Third, forgiveness isn’t an event, it’s more of a process that may need to be repeated. I forgive, gain a sense of peace, then days or weeks later (sometimes years later) I’m somehow reminded of it and my temper flares like it just happened… I have to forgive again, from start to finish all over again. I’ve forgiven both the boss and the girlfriend dozens of times, and yet writing this I’m reminded of the injustice and need to do it again.

My first three points are anecdotal. My fourth & final point is that its part of God’s plan. In Matt 6:14-15 Jesus says that we’ll be forgiven as much as we forgive others, and if we don’t forgive then we won’t be forgiven. Paul exhorts the Colossians to “bear with one another and forgive whatever grievances…” in 3:13. Knowing this, its reasonable to believe that God will help us with forgiveness. In fact I think this is part of His plan, for us to work together in community and learn forgiveness against one another while leaning on Him. I see this as somewhat like exercise, the more we forgive the easier it gets to let go of offenses.

The notable exception to all of this is forgiving God Himself. That’s a category unto its own and I’m probably no help there. I do believe that its appropriate to pray through your relationship with God at all times, even in anger. Forgiving God for perceived offenses is pretty tough. I’ve only dealt with it once and honestly don’t know how I got through it.

If you’re interested in reading about this, try The Art of Forgiving by Lewis B. Smedes. This is his 2nd book on the subject and it really helped me during the summer after a particularly difficult layoff. Pay attention to which book you get though, Smedes first book on forgiveness (called Forgive and Forget) was terrible. I didn’t connect with it at all.

I think my third point above (repeatedly forgiving the same offense) needs more exploration. Sometime soon I’ll tie this together with my previous note and reach a conclusion. This is something that I’ve considered for years, so hopefully I’ll be able to do that soon.

Turn Around

Last week I read something that has challenged my thinking. I have had a pamphlet called How to be Free From Bitterness for at least 15 years. A friend called me last week, we were talking about forgiveness so I decided to review this to see if it would be worth sharing. The entire pamphlet is awesome. It covers general forgiveness, relationships with parents, controlling your tongue, and more. I definitely recommend it if you’re struggling with forgiveness. One aspect of it has stuck with me.

Several times through the material, the author (Jim Wilson) encourages the reader to confess their behavior and/or attitude, then forsake the pattern. He paints this as an event. You have confessed and forsaken that, now you’re done with it.

My life is so much more complicated than that. Which strikes me as very lame.

I wouldn’t characterize myself as a bitter person (but, really, who would say that about himself?). I do gripe about day in & day out annoyances. I do get frustrated with the people that I’m close to. I don’t carry grudges and I do strive to keep short accounts with people. Having said that, there are a couple of long standing grievances that I haven’t shaken in years. I don’t mean that I haven’t forgiven (I have). Quite the opposite. I forgive. Something reminds me of the injustice, so I forgive again. Years later they repeat the behavior, so I forgive again.

I have spoken to the parties involved. I have prayed. I have read books. I have forgiven. Then something will trigger this and I start the process over. This has been going on for years. Now, sometimes I bring it up and sometimes I don’t. This has definitely had an impact on those specific relationships. It’s probably fair to say that this has colored my view of relationships in general.

Wilson invites the reader to a clean slate. Confess then forsake and be free. Turn around and take a new path. I want that.

So the question that I’m wrestling with is, have I allowed my life to become too complicated to recognize freedom that’s available to me?